AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Paralleler Thread funktioniert nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Paralleler Thread funktioniert nicht

Ein Thema von DelphiUser123 · begonnen am 1. Okt 2024 · letzter Beitrag vom 2. Okt 2024
Antwort Antwort
DelphiUser123

Registriert seit: 23. Feb 2013
39 Beiträge
 
#1

Paralleler Thread funktioniert nicht

  Alt 1. Okt 2024, 14:57
Hallo liebes Forum. Einen Code den ich schon einmal vor kurzem hier gepostet habe, habe ich übertragen von einer Timer Procedure in eine Thread Procedure. Ist der USB Stick mit der Datei KEYxyz.txt vorhanden, bleibt das Programm wunschgemäß geöffnet und führt ein mal Laden() aus. Steckt man den USB Stick aus, soll das Programm sofort schließen. Hier liegt das Problem: Anstelle zu schließen, erscheint ein flackernder Bildschirm, man sieht an den Driver und File Komponenten, dass die Laufwerkskontrolle kontinuierlich fortgesetzt wird. Er kommt nicht rein in den "Showmesage('JA')" Bereich.

Ich gebe zu, die Art und Weise der Programmierung ist wahrscheinlich etwas "Oldschool", es soll in erster Linie funktionieren, dass das Programm ohne Vorwarnung schließt ist absichtlich so gewollt. Ich bitte um eine Fokussierung auf mein Problem und bitte keine Wiederholungen von den Posts von vor Kurzem. Vielen Dank für Antworten.

Delphi-Quellcode:
procedure TMyThread.Execute;
var j,i:integer; LookFor: string; f: File; pausieren: boolean;
begin
while not(closing) do begin

     Sleep(1000);
     
try //T
         pausieren:=false;
         j:=0;
   
    while ((j < (Form29.DriveCombobox1.GetCount)) and (not(pausieren))) do
    
    begin //B

      Form29.DriveCombobox1.itemindex:=j;

      Form29.FileListBox1.Directory:=Form29.DriveCombobox1.text[1] + ':/';

      LookFor:='KEYxyz.txt';

      Form29.FileListBox1.Update;

     i:=0;
                                            
    while ((i < (Form29.FileListBox1.Count)) and (not(pausieren))) do
   
    begin //A

      if (Form29.FileListBox1.Items[i]= LookFor) then begin //Showmessage('gefunden');

            FileNom:= Form29.FileListBox1.Directory + LookFor;

                        if timerstarter then begin

                          Laden();
                          timerstarter:=false;
                        end;
                            
                            pausieren:=true;
                                Showmessage('in pausieren drin');

      end;
      Inc(i);

    end; //A
 
       if ((j=Form29.DriveCombobox1.GetCount-1) and (not(pausieren))) then begin Showmessage('JA'); closing:=true; Application.Terminate; end;
 
       Inc(j);

    end; //B
    except //T
     on EInOutError do begin
//showmessage('Fehler mit dem Datenträger!');
     Application.Terminate;
    end;
end;
end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#2

AW: Paralleler Thread funktioniert nicht

  Alt 1. Okt 2024, 14:59
Hallöle...

Ist TMyThread wirklich ein TThread? Zeige mal die Deklaration und das Create...

PS: Wenn ja...nimm schon mal Baldrian wegen der Reaktionen.

Geändert von haentschman ( 2. Okt 2024 um 06:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
877 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Paralleler Thread funktioniert nicht

  Alt 1. Okt 2024, 15:13
Falls der Baldrian noch nicht wirkt, versuche ich es mal vorsichtig:

Auf visuelle Komponenten (Forms, Comboboxen etc.) darf man von einem Thread aus nicht direkt zugreifen. Das ist nicht "oldschool", das geht ganz einfach nicht. Das ist wie beim Autofahren die Reifen wechseln, während man mit 180km/h im Baustellenbereich überholt.
The angels have the phone box.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.463 Beiträge
 
Delphi 12 Athens
 
#4

AW: Paralleler Thread funktioniert nicht

  Alt 1. Okt 2024, 16:14
Alle Parameter die TMyThread zum arbeiten braucht:
Entweder im constructor mitgeben und lokalen Variablen der Threadklasse zuweisen.
Oder als Property der Threadklasse aber dann vor dem Start zuweisen und nach dem Start von außen nicht mehr darauf zugreifen.

Innerhalb von TMyThread.Execute nicht auf die VCL (Formulare, Steuerelemente, Dialoge) oder globale Variablen zugreifen.

Ersetze die Zugriffe auf deine DriveCombobox und FileListBox durch FindFirst(), FindNext() und FindClose().

Statt umständlich mit der Variable "pausieren" zu arbeiten, einfach Abort() aufrufen.

Rückgabewerte ebenfalls als Property anlegen.
Auf diese Property und die VCL kann im TMyThread.OnTerminate-Ereignis zugegriffen werden.
Der constructor und dieses Ereignis laufen im Hauptthread der Anwendung.
  Mit Zitat antworten Zitat
skybibo

Registriert seit: 23. Jun 2008
Ort: NRW
25 Beiträge
 
Delphi 12 Athens
 
#5

AW: Paralleler Thread funktioniert nicht

  Alt 1. Okt 2024, 21:19
Das sieht für mich leider so aus als wurde versucht in großer Verzweiflung Ereignisse zu kreieren, die beim anschließen und entfernen eines USB Sticks erzeugt werden.

Ich habe so etwas auch schon mal verwendet, um beim einstecken eines USB Sticks ein Software Update auszuführen.

Ich habe dabei das Windows Event WM_CHANGEDEVICE ausgewertet. Ein Beispiel hierzu habe ich unter http://nitemsg.blogspot.com/2011/01/...-that-you.html gefunden.
Bernd
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.993 Beiträge
 
Delphi 12 Athens
 
#6

AW: Paralleler Thread funktioniert nicht

  Alt 1. Okt 2024, 22:18
Da GUI-Komponenten per se nicht threadsave sind, ist ein "unsynchronisierter" Zugriff aus Threads nicht anzuraten verboten.

Wird in den Funktionen "nur" ein SendMessage genutzt, oder du nutzt selbst SendMessage, dann gibt es keine Probleme, da die Aufrufe von SendMessage/PostMessage immer im Thread des Erstellers der Komponenten (WinCntrols) ausgeführt wird ... es wird also immer in den MainThread syncronisiert.
Macht die Komponenten-Funktion aber mehr/Anderes, wie Zugriffe auf Variablen, dann war's das und man muß selbst mit Thread.Synchronize ran.



Aber, wie schon einmal gesagt: Wer kommt heute bitte auf die saudumme Idee diese uralten und seit Jahrzehnten nicht mehr gewarteten Komponenten zu benutzen?
Wer kommt auf die leicht blöde Idee GUI-Komponenten nur für eine interne Laufzeitfunktion zu verwenden.
Wer auf die unsinnige Idee das ganze Verzeichnis aufzulisten, um "eine" Datei zu suchen?

Es gibt genügend RTL-Funktionen, um all das ohne GUI zu machen, welche in sich alle threadsave sind.
Delphi-Referenz durchsuchenIOUtils und die anderen alten File-API.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Okt 2024 um 22:43 Uhr)
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
241 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Paralleler Thread funktioniert nicht

  Alt 2. Okt 2024, 09:23
Ich mache das so: Der USB Stick wird nur ab und zu abgefragt, dass Ausstecken überwache ich mit der Message WM_DEVICECHANGE;
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
DelphiUser123

Registriert seit: 23. Feb 2013
39 Beiträge
 
#8

AW: Paralleler Thread funktioniert nicht

  Alt 2. Okt 2024, 15:04
Aber, wie schon einmal gesagt: Wer kommt heute bitte auf die saudumme Idee...
Na ich bin nun mal Amateur. Aber es gibt ja bekanntlich keine blöden Fragestellungen sondern nur blöde (und fiese) Antworten.
Ich werde das ganze jetzt natürlich umkonzipieren ohne GUI Komponenten.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.572 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Paralleler Thread funktioniert nicht

  Alt 2. Okt 2024, 19:51
Du kannst mit FileExists prüfen, ob eine Datei existiert. Sprich für deine Fall reicht einfach ein Timer und da packst du rein:
Delphi-Quellcode:
  if not FileExists('d:\....txt') then
    Application.Terminate;
Wenn das alles ist, was du möchtest.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.993 Beiträge
 
Delphi 12 Athens
 
#10

AW: Paralleler Thread funktioniert nicht

  Alt 2. Okt 2024, 20:43
Aber, wie schon einmal gesagt: Wer kommt heute bitte auf die saudumme Idee...
Na ich bin nun mal Amateur. Aber es gibt ja bekanntlich keine blöden Fragestellungen sondern nur blöde (und fiese) Antworten.
Ich werde das ganze jetzt natürlich umkonzipieren ohne GUI Komponenten.
https://www.delphipraxis.net/215934-...ert-nicht.html

Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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:38 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