Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
436 Beiträge
Delphi 10.3 Rio
|
Re: Threadlogik Problem
25. Aug 2008, 21:31
Hi Alias, ich werds grad mal testen ob das so funktioniert, wie es sollte!
Erstmal herzlichen Dank!
s!
Ok, soweit schon mal Ok, Fenster wird gefunden, Nachricht wird versand. Aber, folgendes Problem was ich nun hab...
Thread läuft (machs nun mit einem Thread), das Fenster wird aufgerufen, Nachricht wurde versand, der User schliesst das Fenster.
Der User öffnet das Fenster erneut, Nachricht wird nicht erneut versand.
Das scheint das Logikproblem bei mir zu sein, wie nun erneut den Thread nach dem Fenster suchen lassen und wenn gefunden Nachricht senden, ohne den Thread vorher zu killen? Sowas wie ein Reset Ereignis, nach dem versenden der Nachricht.
Ich poste mal den Code am besten, eventuell fällt sofort mein Fehler auf?
Delphi-Quellcode:
constructor TIEWatcherThread.Create;
begin
inherited Create(True);
freeOnTerminate := True;
Priority := tpLowest;
end;
destructor TIEWatcherThread.Destroy;
begin
inherited Destroy;
end;
procedure TIEWatcherThread.Execute;
var
wndMain, wndChild: HWND;
begin
b := False;
while not (Terminated = True) do
begin
repeat
wndMain := FindWindow(' IEFrame', nil);
if wndMain <> 0 then
begin
wndMain := FindWindow(' #32770', ' Save Picture');
wndChild := FindWindowEx(wndMain, 0, ' ComboBoxEx32', nil);
wndChild := FindWindowEx(wndChild, 0, ' ComboBox', nil);
wndChild := FindWindowEx(wndChild, 0, ' Edit', nil);
Handle := wndChild;
if Handle <> 0 then
begin
if not b then
begin
GenerateRndGuidFilename;
b := True;
end;
end
else
if ( Handle = 0) and b then
b := False;
end;
until Self.Terminated;
end;
end;
procedure TIEWatcherThread.GenerateRndGuidFilename;
var
wndMain, wndChild: HWND;
FPath, FFilename: array [0..255] of char;
G: TGUID;
S, FDelStr, FExt: string;
begin
MessageSend := False;
repeat
if Handle <> 0 then
begin
wndMain := FindWindow(' IEFrame', nil);
if wndMain > 0 then
begin
wndMain := FindWindow(' #32770', ' Save Picture');
wndChild := FindWindowEx(wndMain, 0, ' ComboBoxEx32', nil);
wndChild := FindWindowEx(wndChild, 0, ' ComboBox', nil);
wndChild := FindWindowEx(wndChild, 0, ' Edit', nil);
if not MessageSend then
begin
coCreateGuid(G);
s := GuidToString(G);
s := StringReplace(s, ' -', ' ', [rfReplaceAll]);
s := StringReplace(s, ' {', ' ', [rfReplaceAll]);
s := StringReplace(s, ' }', ' ', [rfReplaceAll]);
// get filename
SendMessage(wndChild, WM_GETTEXT,
SizeOf(FFilename), integer(@FFilename));
// extract extension
FExt := ExtractFileExt(FFilename);
s := s + FExt;
// clear filename
FDelStr := ' ';
StrPLCopy(@FFilename, FDelStr, SizeOf(FFilename));
SendMessage(wndChild, WM_SETTEXT,
SizeOf(FFilename), integer(@FFilename));
// send random guid as filename + extension
StrPLCopy(@FFilename, s, SizeOf(FFilename));
SendMessage(wndChild, WM_SETTEXT,
SizeOf(FFilename), integer(@FFilename));
MessageSend := True;
b := False;
end;
end
else
if ( Handle = 0) and MessageSend then
MessageSend := False;
end;
until Self.Terminated;
end;
Pps. gibt es ggf. noch eine Möglichkeit zu verhindern, das der Thread 100% CPU schluckt?
|