Autor Beitrag
J_e_n_s
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 14.07.09 18:44 
Hallo,

ich habe folgendes Problem, gleich Vorweg, mit Threadprogrammierung kenne ich mich nicht so gut aus, vielleicht kann mir jemand weiterhelfen.

In meinem Delphi7-Programm verwende ich eine DLL für Bildverarbeitung, welche über ein Handle gestartet wird und auch wieder beendet wird.

Es gibt nun 2 Buttons auf der Programmoberfläche mit denen man die Bildverarbeitung startet bzw beendet --> funktioniert einwandfrei

starten:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button1Click(Sender: TObject);
begin
  hwnd :=  Pointer(Form1.Handle);
  withandle := witDLLInit4(hwnd, 0nilnil0nil);
end;


beenden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button2Click(Sender: TObject);
begin
  WitDllExit(withandle);
end;


Desweiteren soll dies auch über TCP/IP-Befehle möglich sein, hierfür verwende ich die Indy-komponenten:

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:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
    Command : String;
    temp: String;
begin
  Command := AThread.Connection.ReadLn;
  Command := uppercase(Command);
  if (Command = 'LOADDLL'then    //starten
  begin
      hwnd :=  Pointer(Form1.Handle);
      withandle := witDLLInit4(hwnd, 0nilnil0nil);
      temp:='DLL_LOADED' + chr(10);
      AThread.Connection.Write(temp);
  end
  else if (Command = 'UNLOADDLL'then    //beenden
  begin
      WitDllExit(withandle);
      temp:='DLL_UNLOADED' + chr(10);
      AThread.Connection.Write(temp);
  end
  else
  begin
      temp:='NOK:UNKNOWN_COMMAND' + chr(10);
      AThread.Connection.Write(temp);
  end;
end;

--> Auch das funktioniert für sich einwandfrei

D.h. Starten über Button, beenden über Button geht
Starten über TCP/IP, beenden über TCP/IP geht

Jetzt das Problem: Starte ich die DLL über den Button und will Sie über TCP/IP beenden hängt sich das Programm auf, genauso anders herum....
Bin mir ziemlich sicher dass die Pointer nur in ihrem eigenen Thread gültig sind und es deshalb Probleme gibt, finde aber keine verlässliche einfache Lösung dies zu umgehen.

Vielen Dank für Eure Hilfe,
Jens

Moderiert von user profile iconNarses: Quote- durch Delphi-Tags ersetzt
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 14.07.09 19:39 

_________________
PROGRAMMER: A device for converting coffee into software.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 15.07.09 09:00 
Manche Programme nutzen die Thread Local Storage für bestimmte Daten. Bekanntestes Beispiel hierfür ist OpenGL.

Eine einfache Möglichkeit wäre, über Synchronize jegliche Aufrufe für Initialisierung und Finalisierung der DLL generell im Hauptthread der Anwendung auszuführen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
J_e_n_s Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 15.07.09 09:15 
Hallo,

danke BenBE für den Tip, so funktionierts :-)
Prozeduren "DoStartWit" und "DoCloseWit" im Hauptthread, aus dem TCP/IP-Thread dann so aufrufen:
AThread.Synchronize(DoStartWit);
AThread.Synchronize(DoCloseWit);

Gruß,
Jens

Thema kann beendet werden