![]() |
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} |
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). |
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. |
AW: Mal wieder Threads
Du darfst auf VCL Elemente des Hauptthreads nur über Synchronize zugreifen, nie direkt, weil die VCL nicht threadsafe ist.
|
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? |
AW: Mal wieder Threads
Und was ist das:
Zitat:
|
AW: Mal wieder Threads
Zitat:
|
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?
|
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.
|
AW: Mal wieder Threads
Zitat:
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 11:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz