| Autor |
Nachricht |
tif
       
Beiträge: 38 Dabei seit: 11.10.2005 Wohnort: Kirchberg
Winxxx TP, BP, Delphi 1 - 2009
|
Hallo,
ich erzeuge in meiner Anwendung mehrere Threads, die ihrerseits ein Datenmodul beinhalten. In diesem Datenmodul erfolgt eine u.U. längerdauernde Verarbeitung.
Nun möchte ich von der Hauptapplikation aus bei Bedarf diese Verarbeitung(en) abbrechen. Damit das sauber im Datenmodul gehandlet wird, wollte ich nicht die Threads in einer Liste führen und dann per Terminate einzeln abschießen, sondern lieber dem Datenmodul freundlich mitteilen, dass es die Verarbeitung beenden soll.
Dazu möchte ich an alle Datenmodule einer bestimmten Klasse eine - nennen wir sie mal WM_CANCEL - Botschaft schicken.
Ich bekomme es aber nicht hin und frage deshalb hier um Rat.
Das habe ich:
Im Datenmodul
Und der Aufruf
Ich habe schon mit FindWindow / FindWindowEx alle möglichen Variationen durchprobiert, aber keine 'trifft' das Datenmodul.
Habt Ihr einen Lösungsansatz?
Danke
Tino Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Fr 05.03.2010 um 11:07
|

|
|
Xion
       

Beiträge: 1339 Erhaltene Danke: 2 Dabei seit: 23.02.2006 Wohnort: Mitte Deutschlands / A**** der Welt
Windoof 2000, XP Delphi 6 Enterprise / Delphi 2005 Prof
|
tif hat folgendes geschrieben : |
|
Probiers mal mit Tdm_window. Du musst dann aber in dem Stück, wo die arbeit gemacht wird, mit Application.ProcessMessages prüfen, ob messages da sind, das bremst die Arbeit durchaus, du kannst natürlich nur jede Sekunde prüfen, dann braucht das Programm ne Sekunde zum abbrechen, wäre wohl der beste Kompromiss.
Warum machst du nicht einfach ein array, wo du die Dinger rein"constructest":
Den DataModuleCreate dann als Constructor deklarieren.
Dann kannst du einfach mit DataModules[0].CM_Cancel das gleiche erreichen wie so über die messages. (Oder nicht?  )
_________________ a broken heart is like a broken window - it'll never heal
F steht für Feuer das wütet und lodert U steht für unfairer Kampf N steht für nukleares Waffenarsenal (Plankton)
|

|
|
tif
       
(Threadstarter)
Beiträge: 38 Dabei seit: 11.10.2005 Wohnort: Kirchberg
Winxxx TP, BP, Delphi 1 - 2009
|
Hallo,
vielen Dank für die Antwort!
Ja, dass bei FindWindow der Klassenname stehen muss, das hab' ich dann auch gemerkt, trotzdem danke für den Hinweis.
Trotzdem findet er das Fenster nicht - und schon gar nicht 'alle aktiven', wenn es mehrere Treads gibt.
Irgendwie kam ich mit FindWindow / FindWindowEX nicht weiter.
Ich habe es dann doch - wie vorgeschlagen - über eine globale Thread - Liste gemacht, war gar nicht so schlimm wie ich erst vermutet hatte:
Und im Thread / Datenmodul:
Schließlich bei der Verarbeitung im Thread terminated abfragen, wenn true -> Abruch
Also, Danke, viele Grüße und sorry, dass ich dies nicht schon längst gepostet habe!
Ich war ein wenig traurig, weil solang keine Reaktion erfolgt ist.
Tino
|

|
|
HelgeLange
       
Beiträge: 635 Dabei seit: 16.01.2007 Wohnort: Caracas / Venezuela
Windows Vista64 Ultimate Delphi7 - Delphi 2010
|
wenn ich mich recht entsinne, haben zwar TForm und TDataModule gemeinsame Vorfahren, aber den Datenmodule fehlt wohl das Fensterhandle, da es ein unsichtbares Container-Module ist. Wahrscheinlich kriegt es nur im design-Mode ein Handle zugewiesen, damit man Komponenten reinlegen kann.
Hab leider aber gerade keine Zeit, da im Forms-code rumzusuchen.
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|

|
|
tif
       
(Threadstarter)
Beiträge: 38 Dabei seit: 11.10.2005 Wohnort: Kirchberg
Winxxx TP, BP, Delphi 1 - 2009
|
Ja, das ist ein Teil ursprünglichen Problems.
Genau das soll das CreateCommunicationsWindow() aus meinem ersten Post für's Datenmodul 'nachrüsten'.
Der Code stammt sinngemäß aus der (VCL) Forms.pas.
Es wäre interessant zu wissen, ob das so richtig ist oder ob bereits hier der Fehler liegt, dass das Fenster per Findindow() nicht zu finden ist.
Danke
Tino
|

|
|
HelgeLange
       
Beiträge: 635 Dabei seit: 16.01.2007 Wohnort: Caracas / Venezuela
Windows Vista64 Ultimate Delphi7 - Delphi 2010
|
Dann nimm doch einfach ein Formular, statt eines Datenmodules. Das ist ja der unterschied. Oder richte Dir ein kleines fenster ein, hab leider keinen Beispiel code zur Hand, da ich meinen "richtigen" Delphi-Rechner noch in Caracas hab, ich aber jetzt in Kolumbien wohne... Falls Du bis ende April Zeit hast, kann ich dann ja mal schaun...
Ich weiss, dass ich es früher mal so gemacht hatte und es ging gut.
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|

|
|
tif
       
(Threadstarter)
Beiträge: 38 Dabei seit: 11.10.2005 Wohnort: Kirchberg
Winxxx TP, BP, Delphi 1 - 2009
|
Hallo,
danke für deine Antwort!
Bitte mach dir erstmal keine Mühe mehr, ich hab's inzwischen über eine Liste gelöst.
Ich möchte kein Formular verwenden, da diese Anwendung später auch als Dienst laufen soll - und ich damit die unit Forms nicht einbinden darf.
Wahrscheinlich ist bei mir aber schon das Konzept falsch: An einen Dienst Windows- Fensterbotschaften schicken zu wollen ist eventuell widersinnig.
Abgesehen davon, dass ich HIER eine Lösung habe, wäre es natürlich interessant, wie man ein unsichtbares Fenster erzeugt, findet und dann auch benachrichtigt.
Hier gibt es aber im www viele Beispiele, die ich erstmal anschauen muss. Dann gibt's ggf. noch konkretere Fragen.
Also, Danke und viele Grüße nach Übersee!
Tino
|

|
|
HelgeLange
       
Beiträge: 635 Dabei seit: 16.01.2007 Wohnort: Caracas / Venezuela
Windows Vista64 Ultimate Delphi7 - Delphi 2010
|
Schau mal bei den ICS Komponenten (sind kostenlos und mit vollem Source), dort hab ich mal gesehen, dass die sich ein Fenster erzeugen, um sich selbst Nachrichten zu senden wegen irgendwelchen asynchronen Sachen.
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|

|
|
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
|
|
|
|
|