-
Forum: Programmieren allgemein
by Klaus01,
26. Mär 2020
Hallo Anton,
TMeldung habe ich nach cncDataTypes verschoben.
Die TInMessageQueue hat einen generischen Type TMeldung.
saetze_holen := saetze_holen + 1;
LongInt_NCByte(saetze_holen,toSend,toSend,BufByte);{Satz-Nr ablegen}
//New(SendDataRecord2);
//SendDataRecord2^.Data := toSend;
-
Forum: Programmieren allgemein
by Klaus01,
25. Mär 2020
fCncMessageTransmitter := TCncMessageTransmitter.create(fOutMessageQueue, COMPORT, Form1.Handle);
Zwei Zeilen tiefer ist nochmal derselbe Lapsus drin.
Grüsse
Klaus
-
Forum: Programmieren allgemein
by Klaus01,
25. Mär 2020
Hallo Anton,
procedure TCncMessageDispatcher.processMessage(meldung: TMeldung);
var
NewDataRecord : PNewDataRecord;
SendDataRecord : PNewDataRecord;
receivedMessage : TMeldung;
msg : tagMSG;
begin
-
Forum: Programmieren allgemein
by Klaus01,
25. Mär 2020
Hallo Anton,
bei mir ist ein Tippfehler im Create.
override muss raus.
constructor TCncDataReceiver.create(var messageQueue: TThreadQueue<TMeldung>; const comport: shortInt; const destHandle: THandle);
Grüße
Klaus
-
Forum: Programmieren allgemein
by Klaus01,
25. Mär 2020
TCncDataReceiver = class(TThread)
private
fCommTest: TOptiNumericComm;
fMessageQueue: TThreadQueue<TMeldung>;
fComPort: ShortInt;
fDestHandle: THandle;
function receiveDataCom: TMeldung;
public
constructor create(var messageQueue: TThreadQueue<TMeldung>; const comport: shortInt; const destHandle: THandle); override;
destructor destroy;...
-
Forum: Programmieren allgemein
by Klaus01,
25. Mär 2020
Hallo Anton,
tut mir leid -mein Fehler.
TCncMessageTransmitter hat als Basisklasse TThread.
Kannst Du bitte das override am Ende der Create Definition entfernen?
Das gleiche dann bitte auch noch bei TCncDataReceiver.
Grüße
Klaus
-
Forum: Programmieren allgemein
by Klaus01,
24. Mär 2020
Hallo Anton,
ich habe mal versucht alles etwas zu entzerren.
Neu ist eine Thread: cncDataReceiver
Der liest Daten von dem comport und packt die Meldungen
in die Queue fInMessageQueue.
Diese Queue wird von dem Thread cnsMessageDispatcher gelesen.
Die Meldungen werden dort verarbeitet und entsprechende Messages gepostet.
-
Forum: Programmieren allgemein
by Klaus01,
21. Mär 2020
Hallo Anton,
danke, kannst Du mir vielleicht noch die Unit mit den Message Konstanten geben?
TH_MESSAGE, TH_DATAM, TH_CONNECTED, TH_ERROR, TTH_SEND,...
Grüße
Klaus
-
Forum: Programmieren allgemein
by Klaus01,
21. Mär 2020
ersetze mal das move mit diesem:
move(receivedMessage, NewDataRecord^.Data, NewDataRecord^.DataLength);
Grüße
Klaus
-
Forum: Programmieren allgemein
by Klaus01,
21. Mär 2020
.. im Aufruf Stack ist zu sehen, dass etwas beim System.Move
im Argen liegt.
Was ich bisher bei SO gefunden habe:
https://stackoverflow.com/questions/21342177/error-delphi-xe2-exception-class-c00000005
bringt mich zurzeit noch nicht so richtig weiter.
Grüße
Klaus
-
Forum: Programmieren allgemein
by Klaus01,
21. Mär 2020
Hallo Anton,
tritt die "neue" Exception immer auf oder auch wieder nur sporadisch?
Wenn immer stehen die Chancen zu debuggen nicht so schlecht.
Grüße
Klaus
-
Forum: Programmieren allgemein
by Klaus01,
20. Mär 2020
.. was möglich wäre..
receivedMessage ist eine lokale Variable.
Hier wird dem NewDataRecord^.Data die Adresse, nicht der Inhalt, der receivedMessage zugewiesen.
Am Ende der Methode wird die lokale Variable aufgeräumt.
Die Adresse auf die NewDataRecord^.Data zeigt ist möglicherweise
nicht mehr gültig bzw. überschrieben worden.
Versuche mal ob es so besser wird:
-
Forum: Programmieren allgemein
by Klaus01,
20. Mär 2020
Hallo Anton,
receivedMessage := commTest.receiveMessage;
Hier wird receivedMessage ein Array bzw. dessen Adresse zugewiesen.
Die Größe des Array wird in recieveMessage festgelegt.
Daher muss bei receiveMessage keine Arraylänge gesetzt werden.
Ich denke nicht das der Fehler hier liegt.
-
Forum: Programmieren allgemein
by Klaus01,
20. Mär 2020
Hallo Anton,
nein - ist mir nicht klar wo die Exception ausgelöst wird.
System Exception => call FreeMem, ungültige Zeigeroperation
Deutet darauf hin, dass "ein Datensatz/record" schon freigegeben wurde
und jetzt versucht wurde ihn nochmals freizugeben.
In der receiveCom Methode werden pro RS232 Nachricht in Datensatz erzeugt "new()".
Wo werden diese wieder freigegeben -> dispose()?
-
Forum: Programmieren allgemein
by Klaus01,
20. Mär 2020
Was ist der Grund dafür?
Gilt das auch für Thread -> MainThread?
Ok. - habe es gefunden - SendMessage wartet bis die Nachricht angenommen wurde, bis dahin stoppt der Thread seine Arbeit.
Grüße
Klaus
-
Forum: Programmieren allgemein
by Klaus01,
20. Mär 2020
procedure TForm11.processM6Message();
begin
try
with Status.CNC do begin
if (ZREFE <> CNC_Status_Alt.ZREFE) or F_Neu
then begin {Referenzstatus-Ausgabe}
violett(Image1);
case ZREFE of
0:WriteXY(Image1,27,5,'Referenz nicht angefahren');
1:WriteXY(Image1,27,5,'Referenz am anfahren ');
-
Forum: Programmieren allgemein
by Klaus01,
19. Mär 2020
Der Code schaut ok. aus.
Der Compiler mosert über die F_MAN.dfm - hier scheint irgendwo etwas faul zu sein.
16bit unsupported resource.
Vielleciht hilft dieser Thread weiter: https://www.delphipraxis.net/117055-delphi-fehlermeldung-unsupported-16bit-resource.html
Noch etwas anderes.
in receiveDataCom wird Speicher für die Messages allokiert.
Die Message wird mit postMessage verschickt und...
-
Forum: Programmieren allgemein
by Klaus01,
19. Mär 2020
Hallo Anton,
auch das - zusätzlich wird die receiveMessage Funktion lesbarer und übersichtlicher.
Grüße
Klaus
-
Forum: Programmieren allgemein
by Klaus01,
19. Mär 2020
Hallo Anton,
habe mal angefangen das in kleinere Methoden zu packen.
Vielleicht magst Du es Dir mal anschauen.
Grüße
Klaus
-
Forum: Programmieren allgemein
by Klaus01,
15. Mär 2020
.. ist istWertAnzeige eine Routine Deines Threads oder der Hauptprogramms?
Das Image ist kein Bitmap oder?
Bitmaps sind nicht threadsafe.
Grüße
Klaus
-
Forum: Programmieren allgemein
by Klaus01,
13. Mär 2020
.. vielleicht hilft es ein
TCriticalSection.Aquire beim Eintritt in die istWertAnzeige setzn
und vor dem Verlassen ein TCriticalSection.Release.
Grüße
Klaus