AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Threadlogik Problem

Ein Thema von stOrM · begonnen am 22. Aug 2008 · letzter Beitrag vom 27. Aug 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von stOrM
stOrM

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

Re: Threadlogik Problem

  Alt 24. Aug 2008, 17:25
Hm der code iss ja hier oben im Thread, der worker ist vom aufbau her identisch zum watcher...
Also alles in einem thread? Hmm ich hab doch 2 Threads genommen, weil ein Thread ja nicht beendet werden darf, also ned automatisch nur per Userwunsch, der andere ja, der soll nach einmaliger Ausführung beenden, ggf. wieder selber neustarten, wenn der Watcher es sagt.
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#12

Re: Threadlogik Problem

  Alt 24. Aug 2008, 19:50
Naja, kommt darauf an, was der Workerthread sonst noch so zu tun hat. Ich war jetzt davon ausgegangen, dass er nur diese eine Message sendet - so wie du es beschrieben hast.
Der Hauptthread könnte das ja locker machen anstatt einen Workerthread zu starten.

Gruss
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von alias5000
alias5000

Registriert seit: 10. Sep 2005
Ort: Heilbronn
268 Beiträge
 
#13

Re: Threadlogik Problem

  Alt 24. Aug 2008, 20:33
Vorschlag, ein Thread; Pseudocode:
Delphi-Quellcode:
TmeinThread = class(TThread)
...
procedure Execute; override;
...
end;

implementation

Procedure TmeinThread.Execute;
var Handle: cardinal;
b: boolean;
begin
b := false;
repeat
  Handle := FindeDeinFenster;
  if Handle <> 0 then begin
    if not b then begin
      DialogSchließenMessageSenden;
      b := true;
    end;
  end else if (Handle = 0) and b then
    b := false;
  end;
until self.Terminated
end;
Das wäre mein Vorschlag, kombiniert mit der Ein-Thread-Idee

Gruß
alias5000
Im Interesse der Purierung des germanischen Ideoms ist es opertum den immensen Usus peregrieder Verben auf ein Minimum zu reduzieren.
--> www.lanchat2.de <---
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 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
Benutzerbild von alias5000
alias5000

Registriert seit: 10. Sep 2005
Ort: Heilbronn
268 Beiträge
 
#15

Re: Threadlogik Problem

  Alt 26. Aug 2008, 15:23
Zitat von stOrM:
Delphi-Quellcode:
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; //kann man abkürzen, Handle gleich ben drüber zuweisen
        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;
Debugge an der markierten Stelle mal bitte durch, ob der Fall an der gewünschten Stelle eintritt. Es kann ja auch sein, dass dein Dialog nciht freigegeben, sondern nur versteckt wird. Dann wird das Handle ja nicht 0; das wäre ja theoretisch auch noch eine Möglichkeit.

Zitat von stOrM:
Pps. gibt es ggf. noch eine Möglichkeit zu verhindern, das der Thread 100% CPU schluckt?
Sleep ist dein Helfer
Im Interesse der Purierung des germanischen Ideoms ist es opertum den immensen Usus peregrieder Verben auf ein Minimum zu reduzieren.
--> www.lanchat2.de <---
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#16

Re: Threadlogik Problem

  Alt 26. Aug 2008, 15:34
Hi,

mit der Message WM_SETTEXT wird das Fenster doch noch gar nicht geschlossen.

Verstehe ich das richtig:
Du setzt jetzt nur den Dateinamen ein, und erwartest jetzt, dass der Benutzer das Fenster schliesst ?

Und wenn das so ist, dann solltest Du tatsächlich ein sleep(500) einbauen.

Und.

Wieso baust Du in diese Prozedur die gleiche Schleife ein wie im Hauptzweig der Execute ?
Ist das nicht doppelt gemoppelt ?
Und auch hier würde ich mindestens ein sleep(500) einbauen, sonst macht dem Benutzer das Arbeiten keinen Spass mehr.

Gruss
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

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

Re: Threadlogik Problem

  Alt 27. Aug 2008, 20:07
Hmm ich bin jetzt einen anderen Weg als über die Threads gegangen klingt vielleicht wie: "Mit Kanonen auf Spatzen schiessen"
Aber ich hab dafür jetzt einen Hook geschrieben, das klappt wunderbar und ohne irgendwelche Probleme, wenn der User auf "OK" im Save Dialog klickt wird die GUID als Dateiname generiert und das File gespeichert und das geht nun ohne weiteres nicht wie im Thread mit endlos Generierung der GUID, wobei mit das Problem trotzdem mal interssiert hätte, wieso und warum

Trotzdem herzlichen Dank allen die so fleissig am helfen waren
s!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz