Einzelnen Beitrag anzeigen

hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#1

Thread blockiert Applikation (anderen Thread)

  Alt 16. Feb 2007, 10:14
'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
inde deus abest
  Mit Zitat antworten Zitat