AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Variable wird im Thread verändert -> auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Variable wird im Thread verändert -> auslesen

Ein Thema von seim · begonnen am 28. Apr 2009 · letzter Beitrag vom 29. Apr 2009
Antwort Antwort
Benutzerbild von seim
seim

Registriert seit: 11. Nov 2007
83 Beiträge
 
#1

Variable wird im Thread verändert -> auslesen

  Alt 28. Apr 2009, 19:37
Hi,

ich habe grad folgendes Problem:

Also es wird im Hauptthread eine Procedure ausgeführt innerhalb dieser Procedure wird eine Aktion in einem Thread angestoßen:

(pseudo-code)
Delphi-Quellcode:
procedure Exec(Befehl: string);
begin

Plink.MacheBefehl(Befehl); //Läuft in nem Thread ab

Sleep(5000); //Das soll dem Thread die Zeit geben sein Ding zu erledigen.

Ergebnis := PlinkUnit.Befehlrückgabe; //TStringList
end;
So was jetzt passiert ist, dass im "Ergebnis" alles landet was VOR dem Befehl bereits darin stand - der neu ausgeführte Befehl wird nicht übernommen bzw. dessen Rückgabe.

In einer 2. Procedure:
Delphi-Quellcode:
procedure ShowMe;
begin
Ergebnis := PlinkUnit.Befehlrückgabe;
end;
die nach der oberen ausgeführt wird (per Button) steht der Befehl dann aber plötzlich drin!

Also ich habe jetzt folgende zwei Vermutungen:

1. Möglichkeit:
- Exec wird ausgeführt
- Variable "Befehlrückgabe" wird gecached (warum auch immer)
- Code der Procedure Exec wird ausgeführt
-- innerhalb der Procedure wird dann die vorher zwischengespeicherte Variable ausgelesen und vorher war der Befehl noch nicht drin..

2. Möglichkeit:
- Exec wird ausgeführt
- Code der Procedure Exec wird ausgeführt (Befehlrückgabe geschrieben)
- Erst danach wird die betreffende Funktion ausgeführt die überhaupt die Rückgabe von Plink ausliest
- Befehlrückgabe wird neu gesetzt


So die Frage an euch.. woran kann das normalerweise liegen. Ich glaube nicht, dass eine Variable für die Procedure zwischengespeichert wird oder?

lg
Angehängte Dateien
Dateityp: zip sshtest2_105.zip (486,3 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Variable wird im Thread verändert -> auslesen

  Alt 28. Apr 2009, 19:47
Versuchs mal mit MSDN-Library durchsuchenWaitForSingleObject und warte bis der Thread fertig ist. Eventuell reichen die 5Sekunden nicht aus um die Arbeit zu verrichten. Oder hab ich da was missverstanden?
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von seim
seim

Registriert seit: 11. Nov 2007
83 Beiträge
 
#3

Re: Variable wird im Thread verändert -> auslesen

  Alt 28. Apr 2009, 20:02
Ne die reichen aus sind sogar viel zu lang kalkuliert.. es erscheint einfach nichts "neues" in der Ergebnis-Var (in dem Fall ein Memo).

Es wird wirklich jedesmal nur das reingeschrieben was davor auch schon drin stand aber nach Ablauf der Procedure lässt sich das direkt auslesen :/

Wenn ich mir die PLinkRemote.pas anschaue dann wird alles in einem Thread ausgeführt (ganz unten ist das deklariert) deshalb müsste das eigentlich auch nach der Sleep-Zeit auslesbar sein.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Variable wird im Thread verändert -> auslesen

  Alt 28. Apr 2009, 21:06
Guten Abend,

mir sei einmal eine etwas ketzerische Frage erlaubt.
Warum wird hier ein Thread benutzt, wenn dann doch wieder auf das
Ergebnis gewartet werden soll.

Delphi-Quellcode:
procedure Exec(Befehl: string);
begin

Plink.MacheBefehl(Befehl); //Läuft in nem Thread ab

Sleep(5000); //Das soll dem Thread die Zeit geben sein Ding zu erledigen.

Ergebnis := PlinkUnit.Befehlrückgabe; //TStringList
end;
Mir erschließt sich der Sinn nicht so richtig.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von seim
seim

Registriert seit: 11. Nov 2007
83 Beiträge
 
#5

Re: Variable wird im Thread verändert -> auslesen

  Alt 28. Apr 2009, 21:11
Plink muss wohl kontinuierlich befürsorgt werden damit es nicht den Geist aufgibt ^.^ keine Ahnung die Lib hab ich nicht geschrieben und so wirklich 100% verstehen tu ich das Ding auch nicht ich weis nur das alles was ich im PuTTY sehen würde auch in dieser Variable landet und deshalb Execute->Wait->Process um das zu verarbeiten - ich wüsste nicht wie das anders gehen soll außer in nem Timer aber das finde ich dann eher Patch-Work-Programmiert
  Mit Zitat antworten Zitat
Benutzerbild von seim
seim

Registriert seit: 11. Nov 2007
83 Beiträge
 
#6

Re: Variable wird im Thread verändert -> auslesen

  Alt 29. Apr 2009, 21:25
Also ich hab mir die Lib. selbst noch einmal angeguckt und durch ne Änderung daran geht's jetz..

Delphi-Quellcode:
procedure TReadpipeThread.Execute;
 var CS_Readdata :TCriticalSection;
begin
  inherited;
  CS_Readdata := TCriticalSection.Create;
      while (WaitForSingleObject(m_pi.hProcess, 1) <> Wait_Object_0) do
      begin
           Synchronize(m_Client.Read_error);
           Synchronize(m_Client.read_output);
          if terminated then break;
      end;
  CS_Readdata.Free;
end;
Das ist die ursprüngliche Dingens wo der Output von PLink abgefragt wird. Das geschieht in der Funktion m_Client.read_output
Was ich jetzt geändert habe ist dieses Synchronize:

Delphi-Quellcode:
procedure TReadpipeThread.Execute;
 var CS_Readdata :TCriticalSection;
begin
  inherited;
  CS_Readdata := TCriticalSection.Create;
      while (WaitForSingleObject(m_pi.hProcess, 1) <> Wait_Object_0) do
      begin
           m_Client.Read_error; //<---
           m_Client.read_output;//<---
          if terminated then break;
      end;
  CS_Readdata.Free;
end;
Kann mir jemand erklären was ich damit verändert hab' und ob sich das evtl. negativ auswirken kann im späteren Verlauf?
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Variable wird im Thread verändert -> auslesen

  Alt 29. Apr 2009, 21:30
Synchronize lässt die übergebenen Funktionen im Kontext des Mainthreads ausführen.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von seim
seim

Registriert seit: 11. Nov 2007
83 Beiträge
 
#8

Re: Variable wird im Thread verändert -> auslesen

  Alt 29. Apr 2009, 21:31
Das erklärt natürlich alles
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:59 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