![]() |
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Zitat:
Schnell zusammengetippt und daher mit 100%iger Wahrscheinlichkeit die falschen Bezeichner, aber die kannst du ja in der Online-Hilfe nachschlagen, sieh mir nach, daß ich als Gelegenheits-mit-Delphi-Entwickler nicht alle Klassen der VCL auswendig kenne ;-)
Delphi-Quellcode:
Und damit die Handler wissen, was zu tun ist, solltest du die die beiden Datenfelder einer Message anschauen. Das sind zwar nur zwei LongWords, aber du kannst einen Pointer zu einem Integer casten, deswegen kannst du beliebig viele Informationen übergeben, indem du einfach einen Record deklarierst, die Daten dort reinpackst und einen Pointer auf den Record an die Nachricht hängst. Casten ist zwar weder schön noch hübsch, aber bei einer C-API, wie Windows nunmal eine hat, leider nicht immer zu vermeiden.
type
TSomeThread = class(TThread) // ... private FIDIrgendwas: TIDIrgendwas; end; constructor TSomeThread.Create(...); begin inherited; FIDIrgendwas := TIDIrgendwas.Create; end; procedure TSomeThread.MessageHandler(Message: TMessage); // oder so begin case Message.MsgType of // oder so STM_CONNECT begin FIDIrgendwas.Connect(...); // fertig, schicke eine Benachrichtigung an den Hauptthread end; STM_GET begin FIDIrgendwas.Get(...); // fertig, schicke eine Benachrichtigung an den Hauptthread end; end; end; procedure TSomeThread.Execute(...); begin // Nachrichtenschleife end; |
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Gut, danke!
Und was gehört dann in die Execute-Methode hinein? Ich habe das mal aus einem nonVCL-Proggy herausgekramt, leider aber nicht von mir selber geschrieben :mrgreen:
Delphi-Quellcode:
Übrigens in der Hilfe zu PostThreadMessage steht folgendes:
var
Msg: TMsg; begin while GetMessage(Msg, 0, 0, 0) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; Zitat:
LG, ich Edit: Tippfehler |
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Zitat:
Eine Klasse, bei der jeder Methodenaufruf einen weiteren Thread abspaltet funktioniert einfach nicht ohne weiteres. Was aber geht, ist, durch *manuelle* Synchronisierung lediglich *einen* Thread zu verwenden. Das ist das, was ich eben geschildert habe. Das erfordert allerdings entsprechenden Aufwand, um ein Interface aufzubauen. Und man benötigt immer noch zusätzlichen Kontrollcode. Man lagert also nicht die Klasse (oder den Code der Klasse) in einen Thread aus, sondern man lagert die *Benutzung* in einen Thread aus. Diese Benutzung hat man vorher bereits in seinem einzelnen Haupt-Thread, man lagert also effektiv Code aus diesem Haupt-Thread aus, und lässt nicht einfach Aufrufe in einen Thread münden. Nimm zum Beispiel einen Code, der aus einem UCS-16LE-Text einen UCS-16BE-Text (16bit pro Zeichen, Little Endianness gegen Big Endianness) macht. Man kann einen TFile-Stream nehmen und, 2 Bytes einlesen, die Reihenfolge tauschen und die 2 Bytes zurückschreiben. Das Lesen und Schreiben, das wahrscheinlich am längsten dauert (falls nicht, macht man's mit 'nem Diskettenlaufwerk, dann dauert's lange :mrgreen:), in asynchronen Aufrufen zu machen, indem man TFileStream entsprechend modifiziert, würde wahrscheinlich schnell sehr viele Threads erzeugen, die alle noch dabei sind, ihre 2 Bytes zu schreiben. Das Resultat wären jede Menge konkurrierende Laufwerkszugriffe, das kann niemand wollen. Stattdessen lagere ich die Benutzung von TFileStream in einen Thread aus, also den gesamten Vorgang: Lesen, Vertauschen, Schreiben. Dadurch sind alle Operationen in "richtiger" Reihenfolge. Aber ich habe nicht die Klasse ausgelagert, sondern die Benutzung. Zitat:
|
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Zitat:
Zitat:
|
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Gut, Danke! :thumb:
Dann sind meine Fragen so weit geklärt... LG, ich |
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Ich danke auch ... ich habe aber ein etwas anderes Anwendungsgebiet als Indy
mfG Markus PS: So wie du (Frickeldrecktuxer_TM)mir das vorgschlagen hast, hatte ich das auch umgesetzt ... mir ist der Umbau nur praktischer vorgekommen ... hat aer auch Nachteile. |
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Zitat:
|
Re: Synchronisierung von Subthreads (VCL) + Pointerzugriff
Achja, das habe ich übersehen, aber jetzt ist es klar...
Auch wenn es noch immer nicht ganz funktioniert (gibt noch eine AV)... aber das werde ich mir etwas später anschauen; habe gerade meinen Rechner frisch neu aufgesetzt (der Beitrag kommt schon vom neuen System :mrgreen: ). Wahrscheinlich habe ich irgendwo einen Denkfehler eingebaut... LG, ich |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:13 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 by Thomas Breitkreuz