Autor Beitrag
goose
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93



BeitragVerfasst: Mo 12.09.05 13:59 
Hallöchen,

irgendwie bekomm ich das mit dem Thread nicht gebacken.

Also folgendes soll :

Die DLL wird vom MainProgramm initialisiert. Wenn man die DLL
braucht wird sie das erste mal gestartet und bekommt vom Mainprogramm gesagt
das sie das erste mal aufgerufen wird.
Ist dies der Fall, dann wird eine Procedure ( die darf sowieso nur einmal aufgerufen werden )
aufgerufen.

Genau in dieser Procedure ( RegisterDLL ) möchte ich das der Thread gestartet wird.
Der thread muss dann solange das MainProgramm läuft ausgeführt werden !
Im Thread selber müssen immer wieder verschieden andere Proceduren aufgerufen werden
( Internet Checken, Daten an Webseite senden [per Indy eben] usw )

Wenn das MainProgramm beendet wird soll auch der Thread beendet werden.

Ich hab das Tutorial gelesen und bin auch so halbwegs durchgestiegen, aber irgendwie bekomm ich es nicht gebacken.
Immer wenn ich das MainProgramm beende kommt entweder ne Fehlermeldung oder
das hauptprogramm hängt noch im taskanager.

Thread starten :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure Tf_main.RegisterDLL;
begin
  hMainThreadHandle:=BeginThread(nil0, TFNThreadStartRoutine(@TMainThread),
    nil0, dwMainThreadID);
  if hMainThreadHandle<>0 then CloseHandle(hMainThreadHandle);
end;


Der Thread selber :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function Tf_main.MainThread: Boolean;
begin
  Result := True;
    mDebug.Lines.Add('Checking Inet');
    bInet := f_main.CheckInet;    // internet Connection prüfen
    mDebug.Lines.Add('Check Inet fertig');
  if FsEnde = True then
    Result := false;
end;

// MainThread
function TMainThread(zahl: Pointer): LongInt;
begin
  Result:=0;
  repeat
    f_main.MainThread;
  until f_main.MainThread = false;
  ShowMessage('Thread Ende');
end;


FsEnde ist eine Variable die ich im MainProgramm auf True setze sobal
WM_CLOSE gesendet wird.
War so ein Versuch unter vielen....sehr vielen :-)

Kann mir vielleicht einer sagen was hier schief geht ?

"" ShowMessage('Thread Ende') "" wird nicht aufgerufen
"" Das MainProgramm bleibt im TaskManager ""

Dank Euch
Matthias
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 12.09.05 18:17 
Nimm doch lieber einen TThread-Nachfahren. Das geht irgendwie einfacher. Es ist eine gute Demo bei Delphi mit dabei.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Type
  TMyThread = Class (TThread)
  ..
  Protected
    Procedure Execute; Override;
  End;

Procedure TMyThread.Execute;
Begin
  While not Terminated do begin
    DoYourStuff here
    End;
End;
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Mo 12.09.05 18:30 
denke daran, dass globale Variablen Thread-sicher sein müssen, sonst ist deren Zustand nicht definiert.

Wenn du -wie mein Vorredner - TThread ableitest, braucht du auch den ganzen DLL-Kram nicht.
grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?