AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Thread blockiert Applikation (anderen Thread)
Thema durchsuchen
Ansicht
Themen-Optionen

Thread blockiert Applikation (anderen Thread)

Ein Thema von hirnstroem · begonnen am 16. Feb 2007 · letzter Beitrag vom 16. Feb 2007
Antwort Antwort
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
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#2

Re: Thread blockiert Applikation (anderen Thread)

  Alt 16. Feb 2007, 11:34
Versuche mal, den Thread statt mit "Execute()" mit "Resume()" zu starten.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
hirnstroem

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

Re: Thread blockiert Applikation (anderen Thread)

  Alt 16. Feb 2007, 12:10
Danke ste_ett, sehr nett, Resume hilft in der Tat.
inde deus abest
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#4

Re: Thread blockiert Applikation (anderen Thread)

  Alt 16. Feb 2007, 12:22
"Resume()" bedeutet, dass die Methode wirklich in einem extra Thread ausgeführt wird.
Wenn man "Execute()" direkt aufruft, wird die Methode in selben Thread ausgeführt.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#5

Re: Thread blockiert Applikation (anderen Thread)

  Alt 16. Feb 2007, 13:40
Delphi-Quellcode:
constructor TDBPictureThread.Create(CreateSuspended: Boolean; FAddress: string);
begin
  FAddress := FAddress;
  inherited Create(CreateSuspended);
end;
So duerfte es besser sein. FAddress ist dann bereits gesetzt wenn das "inherited Create()" eventuell den Thread gleich ausfuehrt.
Der Aufruf von Execute ist ja falsch und der Aufruf von Resume ist kontraproduktiv. Der Thread wuerde ja starten selbst wenn CreateSuspended True ist.
  Mit Zitat antworten Zitat
hirnstroem

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

Re: Thread blockiert Applikation (anderen Thread)

  Alt 16. Feb 2007, 13:54
Mkay, wieder etwas gelernt. Vielen Dank euch beiden!
inde deus abest
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Thread blockiert Applikation (anderen Thread)

  Alt 16. Feb 2007, 14:58
Ich sehe da noch üble Dinge in deinem Code.
1.) Warum benützt du TIWImage ? TImage und alles was davon abgeleitet wurde ist doch ein Control und Controls haben in einem Thread nichts zu suchen
==> TPicture verwenden
2.) Speicherleck: imgReceived.Free fehlt
3.) kein Resourcen-Schutzblock vorhanden
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Thread blockiert Applikation (anderen Thread)

  Alt 16. Feb 2007, 15:06
Warum self.terminate am Ende? Das macht doch der Thread an dieser Stelle sowieso.

@shmia Warum kein control in einem Neben-Thread. Im Hauptthread gehts ja auch und solange da keine Interaktion besteht...
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: Thread blockiert Applikation (anderen Thread)

  Alt 16. Feb 2007, 15:48
Zitat von sirius:
@shmia Warum kein control in einem Neben-Thread. Im Hauptthread gehts ja auch und solange da keine Interaktion besteht...
Nur der Hauptthread darf direkt mit Controls arbeiten, da die VCL ja nicht threadsicher ist.
Neben-Threads müssen sich über .Synchronize() beim Hauptthread melden und im Kontext vom Hauptthread dürfen dann Manipulationen von Controls stattfinden.
Da das Image im Beispiel keinen Parent zugewiesen bekommen hat, passiert so auch nichts.
Aber es ist einfach unsauber und unnötig.
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz