Thema: Delphi Threadlogik Problem

Einzelnen Beitrag anzeigen

Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
436 Beiträge
 
Delphi 10.3 Rio
 
#14

Re: Threadlogik Problem

  Alt 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?
  Mit Zitat antworten Zitat