Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Mal wieder Threads (https://www.delphipraxis.net/164268-mal-wieder-threads.html)

DelTurbo 5. Nov 2011 10:01

Mal wieder Threads
 
Hi,
ich habe nur eine kurze frage. Ich erstelle mit TJvMTThread einen Thread, der über Postmessage mit dem programm redet, um ausgaben zu machen. Leider musste ich feststellen das das öfters mal in die hose geht. Leider weiss ich nicht warum. Ich bekomme nie 2x die gleiche fehler meldung. Aber es sind immer ungültige Pointer. z.b. mal in StrLen oder Minimizename usw.

Ist es besser wenn man Threads wie folgt macht? Weil von da kenne ich das mit dem Postmessage. Oder ist das mit dem Post falsch bei TJvMTThread?

Danke im voraus

Delphi-Quellcode:
const
  THREAD_TERMINATE                = $0001;
  THREAD_SUSPEND_RESUME           = $0002;
  THREAD_GET_CONTEXT              = $0008;
  THREAD_SET_CONTEXT              = $0010;
  THREAD_SET_INFORMATION          = $0020;
  THREAD_QUERY_INFORMATION        = $0040;
  THREAD_SET_THREAD_TOKEN         = $0080;
  THREAD_IMPERSONATE              = $0100;
  THREAD_DIRECT_IMPERSONATION     = $0200;
  THREAD_SET_LIMITED_INFORMATION  = $0400;
  THREAD_QUERY_LIMITED_INFORMATION = $0800;
  THREAD_ALL_ACCESS               = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $03FF;

function OpenThread(dwDesiredAccess: DWord;
                    bInheritHandle: Bool;
                    dwThreadId: DWord): DWord; stdcall; external 'kernel32.dll';

{##############################################################################}

procedure StartNewThread;
begin
    ThreadHandle:=BeginThread(nil, 0, @MyThread,@MyID, 0, ThreadID);
    if ThreadHandle<>0 then CloseHandle(ThreadHandle);
end; {StartNewThread}

jaenicke 5. Nov 2011 10:24

AW: Mal wieder Threads
 
Ich weiß nicht was die JEDI-Variante anders macht als ein normaler TThread (den ich immer benutze), aber dort ist das mit PostMessage usw. kein Problem.

Die Fehlerbeschreibung hört sich eher danach an als ob du FreeOnTerminate und Resume benutzt und das ist böse, insbesondere in der Kombination...
Denn die Fehlermeldung bedeutet meistens, dass ein Objekt beim Zugriff darauf schon freigegeben war, oft wird da gerade versucht das Objekt erneut freizugeben.

Wie sieht dein Thread denn aus? Und wie benutzt du ihn?

Und FastMM kann dir auch genauer sagen, ob meine Vermutung bezüglich der Freigabe schon freigegebener Objekte stimmt (wobei es für multi-threaded Anwendungen nicht immer gut funktioniert).

DelTurbo 5. Nov 2011 10:39

AW: Mal wieder Threads
 
Öhm, der Thread macht eigentlich nicht viel. Er schreibt daten in eine MySql. Nun fällt mir grade ein, das ich in dem Thread auch Threads erstelle und benutze. Die machen aber keine ausgbabe, sondern erzeugen bis zu 5 Querys auf die MySql. Diese bis zu 5 Threads werden ohne Jvcl gemacht. So wie oben geschrieben.

In der schleife (dem eigentlichen Thread) wird immer alle 100ms ausgegeben welches file er grade bearbeitet, wieviel es ingestamt sind und noch 2-3 ausgaben. Das mache ich nichtmehr in dem Thread mit z.b.

Form1.Label1.Caption:='doedel';

Sondern dafür habe ich eine extra routine die mit Postmessage aufgerufen wird.

Lasse ich nun die diese ausgaben weg, scheppert es nichtmehr. Das blöde ist, das passiert immer erst nach ein paar minuten, womit das testen zur qual wird.

Luckie 5. Nov 2011 11:37

AW: Mal wieder Threads
 
Du darfst auf VCL Elemente des Hauptthreads nur über Synchronize zugreifen, nie direkt, weil die VCL nicht threadsafe ist.

DelTurbo 5. Nov 2011 11:49

AW: Mal wieder Threads
 
Mache ich doch nicht. Oder ist das Postmessage auch falsch? Wenn ja, eine zeile Source wäre nett. :-D

Nochwas anderes, der unterschied zw. PostMessage und SendMessage ist doch nur, das SendMessage wartet bis die aufgerufene sub fertig ist, wobei Post das einfach "einreiht" und sofort wieder da ist. Ist das richtig?

Luckie 5. Nov 2011 12:14

AW: Mal wieder Threads
 
Und was ist das:
Zitat:

In der schleife (dem eigentlichen Thread) wird immer alle 100ms ausgegeben welches file er grade bearbeitet, wieviel es ingestamt sind und noch 2-3 ausgaben. Das mache ich nichtmehr in dem Thread mit z.b.

Delphi-Quellcode:
Form1.Label1.Caption:='doedel';


DelTurbo 5. Nov 2011 12:19

AW: Mal wieder Threads
 
Zitat:

Zitat von DelTurbo (Beitrag 1134578)
In der schleife (dem eigentlichen Thread) wird immer alle 100ms ausgegeben welches file er grade bearbeitet, wieviel es ingestamt sind und noch 2-3 ausgaben. Das mache ich nichtmehr in dem Thread mit z.b.

Form1.Label1.Caption:='doedel';

Sondern dafür habe ich eine extra routine die mit Postmessage aufgerufen wird.

Bitte lies dochmal richtig. Ich habe nun die sachen fett gemacht.

Bernhard Geyer 5. Nov 2011 12:21

AW: Mal wieder Threads
 
Wie läuft genau der DB-Zugriff. hast du für jede Thread auch eine eigene Connection? Ist die verwendete Zugriffskomponenten überhaupt Thread-Sicher?

Luckie 5. Nov 2011 12:24

AW: Mal wieder Threads
 
Versuch es mal mit SendMessage. Aber wenn du die Threadklasse benutzt würde ich es sicherheitshalber mit Synchronize machen. Und bitte wirf mir nicht vor, dass ich besser lesen solle, wenn du schon so sparsam mit Quellcode bist.

DelTurbo 5. Nov 2011 12:33

AW: Mal wieder Threads
 
Zitat:

Zitat von Luckie (Beitrag 1134592)
Und bitte wirf mir nicht vor, dass ich besser lesen solle, wenn du schon so sparsam mit Quellcode bist.

Das war doch kein vorwurf. Man(n) kann dochmal was überlesen. Das ist mir nun schon öfters hier passiert. "Ihr" lest sachen aus sätzen, die da garnicht stehen. Stimmt der Focus vom Röhrenmonitor nicht? Oder seit ihr wirklich sooo dünnhäutig??? Sorry aber das verstehe ich wirklich nicht. Da einen vorwurf rauszulesen.

Ich greife keinen an, beschimpfe keinen, und muss mich auchnoch für sachen rechtfertigen die ich garnicht gemacht habe. Irgendwie bleibt mir da die luft weg.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:41 Uhr.
Seite 1 von 3  1 23      

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