Autor Beitrag
Yasso
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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:

ausblenden 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.

ausblenden 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 user profile iconGausi: Delphi-Tags hinzugefügt

_________________
Yasso
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 04.12.06 11:12 
Moin!

Was auch immer du vor hast :nixweiss:, 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... :mahn: (sondern vermutlich eher Fehler produziert) :|

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
type 
  TOnProcessMessages = procedurestdcall;

...

procedure OnProcessPessages;
begin
  Application.ProcessMessages;
end;

  ...
  // DLL-Aufruf
  DLLProc(@OnProcessMessages, ...);

  ...

DLL:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type 
  TOnProcessMessages = procedurestdcall;

procedure DLLProc(AOnProcessMessages: TOnProcessMessages; ...); stdcall;
begin
  ...
  if Assigned(AOnProcessMessages) then
    AOnProcessMessages;
  ...
end;


Stefan

_________________
Ein Computer ohne Windows ist wie eine Schokoladentorte ohne Senf.
Yasso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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.
ausblenden 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;  // d.h. solange warten bis Rückmeldung empfangen wurde.
  until IsBusy = false;
  ...
  Result := RetValue;
  ...
end;

procedure udp1.OnDataAvailable(...);
begin
  ...
  //Daten lesen und auswerten.
  RetValue := xx;
  ...
  IsBusy := false;  // wieder frei
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 04.12.06 12:01 
Moin!

user profile iconYasso 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"... :roll: ;) :arrow: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 04.12.06 12:15 
Moin!

user profile iconYasso 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"... :D

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Yasso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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... :nixweiss:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Di 05.12.06 07:56 
user profile iconYasso 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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?