Autor |
Beitrag |
Yasso
      
Beiträge: 35
|
Verfasst: Mo 04.12.06 11:06
hallo,
ich brauche das "application.processmessages" oder ähnliches in einer DLL.
Ich könnte z.b. eine Funktion/procedure in der DLL schreiben, die ungefähr so aussieht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| ... var application : TApplication; ... procedure Init(apphandle : THandle); begin application.handle := apphandle; end;
procedure proc2; begin ... application.processmessages; ... end; |
Das Problem ist aber, daß ich das application.handle vom Hauptprogramm nicht wie oben übergeben will, sondern diese soll in der DLL ermitteln werden.
z.b.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| ... var application : TApplication; ... procedure Init; var apphandle : THandle; begin apphandle := hier soll das application.handle des Hauptprogramm ermittelt werden. application.handle := apphandle; end;
procedure proc2; begin ... application.processmessages; ... end; |
ist sowas möglich??
Danke
Yasso
Moderiert von Gausi: Delphi-Tags hinzugefügt
_________________ Yasso
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 04.12.06 11:12
Moin!
Was auch immer du vor hast  , die VCL ist eh nicht threadsave, so dass ein Abarbeiten der MessageLoop aus einem anderen Thread als dem Haupt-Thread der Anwendung dir sowieso nicht weiter hilft...  (sondern vermutlich eher Fehler produziert)
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Stefan.Buchholtz
      
Beiträge: 612
WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
|
Verfasst: Mo 04.12.06 11:54
Das ist so meines Wissens nicht möglich. Das Application.ProcessMessages sollte vom Application-Objekt das Hauptprogramms ausgeführt werden, damit die Nachrichten richtig verarbeitet werden können.
Ich würde der DLL eine Callback-Funktion ins Hauptprogramm übergeben, die im Hauptprogramm dann Application.ProcessMessages aufruft.
Das sieht dann in etwas so aus:
Hauptprogramm:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| type TOnProcessMessages = procedure; stdcall;
...
procedure OnProcessPessages; begin Application.ProcessMessages; end;
... DLLProc(@OnProcessMessages, ...);
... |
DLL:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TOnProcessMessages = procedure; stdcall;
procedure DLLProc(AOnProcessMessages: TOnProcessMessages; ...); stdcall; begin ... if Assigned(AOnProcessMessages) then AOnProcessMessages; ... end; |
Stefan
_________________ Ein Computer ohne Windows ist wie eine Schokoladentorte ohne Senf.
|
|
Yasso 
      
Beiträge: 35
|
Verfasst: Mo 04.12.06 11:54
danke.
ich habe in der DLL eine Komponente implmentiert, die z.b. über UDP Daten senden und empfangen kann.
Mit Hilfe einer Funktion kann ich Daten über UDP senden. Und über z.b. (event)OnDataAvailable(..) werden die Daten/Rückmeldung empfangen.
z.B.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| ... var IsBusy : Boolean; RetValue : Byte;
Function SendData(daten..) : Byte; stdcall; begin IsBusy := true; udp1.send(daten); repeat application.processmessages; until IsBusy = false; ... Result := RetValue; ... end;
procedure udp1.OnDataAvailable(...); begin ... RetValue := xx; ... IsBusy := false; end;
function GetIsBusy : Boolean; stdcall; begin Result := IsBusy; end; |
Mein Hauptprogramm soll auf den Rückgabewert der Funktion "Senddata" warten.
Dabei müssen aber alle Messages des Hauptprogramms weiter abgearbeitet werden. Sonst würde das Hauptprogramm auf nichts mehr reagieren, erst bis die Rückmeldung empfangen wurde.
Danke
Yasso
_________________ Yasso
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 04.12.06 12:01
Moin!
Yasso hat folgendes geschrieben: | Mein Hauptprogramm soll auf den Rückgabewert der Funktion "Senddata" warten.
Dabei müssen aber alle Messages des Hauptprogramms weiter abgearbeitet werden. |
Immer das gleiche, "ereignisorientiert warten"... FAQ-Beitrag dazu!
Mach es dann doch gleich richtig und definiere ein entsprechendes Ereignis, dass du z.B. über PostMessage aus der DLL der Hauptanwendung "zustellst". Die Hauptanwendung wiederum muss als Zustandsautomat mit entsprechenden Zuständen (Warten auf Rückmeldung, Senden von Anfrage, Warten auf Benutzereingabe, etc.) umgehen können.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
Zuletzt bearbeitet von Narses am Mo 25.12.06 20:20, insgesamt 1-mal bearbeitet
|
|
Yasso 
      
Beiträge: 35
|
Verfasst: Mo 04.12.06 12:08
Zitat: | Immer das gleiche, "ereignisorientiert warten"... |
das habe ich bisher immer so gemacht.
Es ist aber leider so, dass ich jetzt oft warten MUSS!
_________________ Yasso
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 04.12.06 12:15
Moin!
Yasso hat folgendes geschrieben: | Zitat: | Immer das gleiche, "ereignisorientiert warten"... |
das habe ich bisher immer so gemacht. |
Das macht eine Polling-Schleife in einer ereignisorientierten Umgebung aber nicht "besser"...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Yasso 
      
Beiträge: 35
|
Verfasst: Mo 04.12.06 13:29
wenn es möglich wäre das Application.Handle irgendwie in der DLL zu ermitteln,
dann würde ich das ganze testen.
Ob gut oder schlecht das lässt sich dann feststellen.
Danke
_________________ Yasso
|
|
Yasso 
      
Beiträge: 35
|
Verfasst: Mo 04.12.06 19:46
ich habe bis jetzt nichts brauchbares gefunden.
Ist es echt nicht möglich das "Application.Handle" der Hauptanwendung in einer dll zu ermitteln!
Ich bin seit eine Woche daran, und bis jetzt leider kein Erfolg!
Gruß
Yasso
_________________ Yasso
|
|
Yasso 
      
Beiträge: 35
|
Verfasst: Mo 04.12.06 20:52
ich habe jetzt folgendes gemacht:
das Unit "Forms" in der DLL deklariert.
und für Application.ProcessMessages habe ich Forms.Application.ProcessMessages geschrieben. So funktioniert es.
Warum es so funktioniert weis ich nicht! Hat jemand Ahnung?
Könnte dadurch Probleme geben?
Gruss
Yasso
_________________ Yasso
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 04.12.06 21:28
Moin!
Warum du den DLL-Funktionen nicht einfach das Handle mitgibst, hab ich immer noch nicht verstanden, aber nun gut...
Du kriegst nur dann definitiv Probleme, wenn du Application.ProcessMessages NICHT aus dem Kontext des Haupt-Threads aufrust, der Rest sollte AFAIK egal sein.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Di 05.12.06 07:56
Yasso hat folgendes geschrieben: | ich habe jetzt folgendes gemacht:
das Unit "Forms" in der DLL deklariert.
und für Application.ProcessMessages habe ich Forms.Application.ProcessMessages geschrieben. So funktioniert es.
Warum es so funktioniert weis ich nicht! Hat jemand Ahnung?
Könnte dadurch Probleme geben?
Gruss
Yasso |
Hallo,
vermutlich hast du jetzt in der DLL eine neue Variable Application definiert. Die kann zwar ProcessMessages ausführen, aber es ist denke ich nicht die Application deines Hauptprogramms, daher wird sie mit den Messages nichts anfangen können; sie kriegt aber wahrscheinlich auch keine, die für dein Hauptprogramm bestimmt waren.
Grundsätzlich ist eine DLL ja auch eine EXE, die für andere Programme Prozeduren ausführt - und sonst nichts. Ausserdem kann das eigentlich schon deshalb nicht funktionieren, weil eine DLL genauso mit C/C++ und andern Programmen funktionieren muss, die von Delphis Application überhaupt nichts wissen.
Ich schätze also, du hast da eine Dummy Application, die eigentlich nichts tut. Das reicht aber möglicherweise, um den Windows Scheduler aufzurufen.
Gruss Reinhard
|
|
Yasso 
      
Beiträge: 35
|
Verfasst: Sa 09.12.06 17:36
Hi,
Zitat: |
vermutlich hast du jetzt in der DLL eine neue Variable Application definiert.
|
nein, das habe ich nicht getan.
Ich habe nur das Unit Forms deklariert.
und da kann ich das Procedure Forms.Application.ProcessMessages auch verwenden.
Es schein gut zu funktionieren.
Gruß
Yasso
_________________ Yasso
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Sa 09.12.06 19:19
Hast du jetzt einmal probiert ob wirklich die Ereignisse in deinem Hauptprogramm weiter verarbeitet werden wenn du in deiner DLL Funktion auf etwas wartest? Lass mal 30 Sekunden warten und schau dabei nach ob du deine Anwendung noch beutzen kannst. Es würde mich etwas wundern wenn dem so wäre.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|