'loha Folks,
in einer Applikation wird ein Thread kreiert. Bei dessen Exekution folgender Code ausgeführt wird:
Delphi-Quellcode:
procedure TDBPictureThread.Execute;
var
imgReceived: TIWImage;
Address, UserID, Command: String;
begin
imgReceived := TIWImage.Create(nil);
PictureDeviceAddress := HexStrToInt(FAddress);
UserID := CANBus.GetUserID;
Address := IntToHex(HexStrToInt(FAddress) or (StrToInt(UserID) shl 21), 2);
Command := '1E';
CANBus.SendMessage
(Address, '8', Command, '0', '0', '0', '0', '0', '0'); // hier wird ein Bild angefordert
imgReceived.Picture.Bitmap := CANCommunication.TryToGetPicture(FAddress, UserID, Command); // hier wird nachgeschaut ob das Bild schon da ist und so
imgReceived.Picture.SaveToFile('C:\Dokumente und Einstellungen\ava\Desktop\' + DateTimeToStr(Now) + '.bmp');
// UCommunication.DBPictureBuffer.Data.Clear;
DBPictureFlag := True;
Self.Terminate;
end;
Kreiert wird der Thread so:
Delphi-Quellcode:
constructor TDBPictureThread.Create(CreateSuspended: boolean; FAddress: String);
begin
inherited Create(CreateSuspended);
Self.FAddress := FAddress;
Self.Execute;
end;
Das eigentliche Problem ist nun, dass nach dem versenden einer CAN-Message, die ankommenden Daten erst dann verarbeitet werden, wenn der Thread terminiert wurde und das will ich nicht.
Eintreffende Daten werden ebenfalls über einen Thread verarbeitet (Polling). Dieser Thread sieht momentan folgendermassen aus:
Delphi-Quellcode:
procedure TRxThread.Execute;
var
InputString: String;
i: Integer;
CANMessage: CANMsg;
begin
repeat
if (CANUSBRead(CANMessage) = ERROR_CANUSB_OK) then
begin
InputString := '0' + IntToHex(CANMessage.id, 2) + IntToHex(CANMessage.len, 2);
for i := 0 to CANMessage.len do InputString := InputString + IntToHex(CANMessage.data[i], 2);
CANCommunication.WriteDataIntoBuffer(InputString);
end;
until 1 <> 1;
end;
Mir ist bewusst, dass dieser Thread die CPU unnötig belastet, aber aufgrund zur Zeit noch fehlernder Callback-Funktionen des Treibers, mache ich das ganze vorübergehend auf diese Weise.
Wie gesagt, der TRxThread beginnt erst dann mit seiner arbeit, wenn der TDBPictureThread terminiert wird. Ist das normal so? Oder gibt es eine Möglichkeit, dass dieser TRxThread auch dann weiterarbeitet, wenn der TDBPictureThread am laufen ist?
Grüsse
hirsntroem