Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi thread (https://www.delphipraxis.net/74332-thread.html)

Sascha L 1. Aug 2006 16:15

Re: thread
 
Wieso? Er hat erstens gesagt, was er machen möchte und er hat auch gesagt, dass das mit den Buttons nur ein Beispiel sein soll, damit er es versteht!

@Nisbo:

Füge eine neue Unit zu deinem Projekt hinzu. Da kopierste dann den Code von jfheins rein.

OnButton1Click:

Delphi-Quellcode:
MyThreadVar := TMyThread.Create(false);

Nisbo 1. Aug 2006 16:16

Re: thread
 
unter anderen das runterladen von csv-dateien sowie das verarbeiten selbiger, das selber geht ja auch (bis auf meine anderen fragen :D) nur ich möchte halt das mein programm dabei nicht einfriert

aus der delphidemo habe ich gesehen das mit den threads ja auch nur andere prozeduren aufgerufen werden nur ist mir dabei zuviel unwichtiges drinn, also allgemein zuviel, bin momentan immernoch dabei den code soweit zu kürzen das nur eine message kommt, das ist aber halt nicht wirklich einfach für einen noob in sachen threads

habe da auch schon mal experimentiert und

Delphi-Quellcode:
procedure TThreadSortForm.BubbleSortBoxPaint(Sender: TObject);
begin
showmessage('test');
sleep(3000);
showmessage('ausgeschlafen');
  //PaintArray(BubbleSortBox, BubbleSortArray);
end;
genommen, in den 3 sekunden sleep reagiert das programm allerdings trotzdem nicht

wie gesagt ob jetzt ne showmessage sinnvoll ist oder nicht sei mal dahingestellt, mir geht es in der hinsicht um das verstehen durch das ansehen von code

man könnte ja auch in der einen prozedur bei button 1 eine zahl solange um 1 erhöhen bis 1 Billion erreicht ist und das dann in einem tedit ausgeben, allerdings muß button 2 dann irghendwas anderes machen könen wie z.b. showmessage ausgeben ohne das das programm hängt

Nisbo 1. Aug 2006 16:20

Re: thread
 
@ Sascha L

ist doch auch wieder nur ein schnipsel und dazu dann noch über 2 units verteilt :(
wo einfügen ? das sind dann alles so fragen die mir durch den kopf gehen weswegen ich ja nach einem kompletten code frage

ich denke ich trinke erstmal nen bier, mir dampft der kopf ....

xaromz 1. Aug 2006 16:25

Re: thread
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe Dir mal ein kommentiertes Testprojekt mit einem Button erstellt.
Schau Dir das mal an und stell dann konkrete Fragen.

Der Thread im Beispielprogramm lässt einfach eine Progressbar laufen, damit man ihn arbeiten sieht.

Anzumerken wäre noch, dass das nur ein Beispiel ist und man Thread keinesfalls in der hier gezeigten Weise verwenden sollte. Beispielsweise sollte man einen Thread nicht jedesmal neu erstellen, sondern lieber jedesmal aufwecken, wenn es etwas zu tun gibt.

Gruß
xaromz

Nisbo 1. Aug 2006 17:51

Re: thread
 
@ xaromz

vielen dank, jetzt komme ich langsam vorwärts, habe deinen code auch schon etwas verändert und erweitert sowie einen neuen thread erstellt, jetzt stellt sich aber die frage warum eine standardfunktion wie strtoint oder inttostr nicht funktioniert, bekomme da nur undefinierter bezeichner

so schaut dein kompletter umgebauter democode jetzt aus

Delphi-Quellcode:
unit Unit1;

interface

uses
  Forms, StdCtrls, Classes, Controls, ComCtrls;

type
  TForm1 = class(TForm)
    ProgressBar1: TProgressBar;
    Button1: TButton;
    ProgressBar2: TProgressBar;
    Button2: TButton;
    Edit1: TEdit;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses
  Windows, Dialogs;

{$R *.dfm}

{ TMyThread }

// Thread 1 START Thread 1 START Thread 1 START Thread 1 START
// Thread 1 START Thread 1 START Thread 1 START Thread 1 START
// Thread 1 START Thread 1 START Thread 1 START Thread 1 START
// Thread 1 START Thread 1 START Thread 1 START Thread 1 START
type
  Thread_Nr_01 = class(TThread)
    PB: TProgressBar;
    procedure Hauptprogramm;
    procedure Execute; override;
  end;

procedure Thread_Nr_01.Execute;
begin
  while not Terminated do begin
    Synchronize(Hauptprogramm); // Zugriff auf VCL-Elemente synchronisieren
    Sleep(10);                 // etwas warten VCLSync
  end;
end;

procedure Thread_Nr_01.Hauptprogramm;
var zahlenwert : integer;
begin
  // Fertig?
  if PB.Position < PB.Max then PB.StepIt // Progressbar weiter
  else Terminate;                       // Thread beenden
end;

// Button 1 Click
procedure TForm1.Button1Click(Sender: TObject);
var Th: Thread_Nr_01;
begin
  ProgressBar1.Position := 0;     // ProgressBar 1 auf Null setzen
  Th := Thread_Nr_01.Create(True); // Thread erzeugen (suspended)
  Th.FreeOnTerminate := True;     // Thread gibt sich selbst frei
  Th.PB := ProgressBar1;          // Progressbar 1 zuweisen
  Th.Resume;                      // Thread starten
  ShowMessage('Thread für PB1');  // Message anzeigen, Thread läuft weiter
end;

// Button 2 Click
procedure TForm1.Button2Click(Sender: TObject);
var Th: Thread_Nr_01;
begin
  ProgressBar2.Position := 0;     // ProgressBar 2 auf Null setzen
  Th := Thread_Nr_01.Create(True); // Thread erzeugen (suspended)
  Th.FreeOnTerminate := True;     // Thread gibt sich selbst frei
  Th.PB := ProgressBar2;          // Progressbar 2 zuweisen
  Th.Resume;                      // Thread starten
  ShowMessage('Thread für PB2');  // Message anzeigen, Thread läuft weiter
end;

// Thread 2 START Thread 2 START Thread 2 START Thread 2 START
// Thread 2 START Thread 2 START Thread 2 START Thread 2 START
// Thread 2 START Thread 2 START Thread 2 START Thread 2 START
// Thread 2 START Thread 2 START Thread 2 START Thread 2 START
type
  Thread_Nr_02 = class(TThread)
    procedure Hauptprogramm;
    procedure Execute; override;
  end;

procedure Thread_Nr_02.Execute;
begin
  while not Terminated do begin
    Synchronize(Hauptprogramm); // Zugriff auf VCL-Elemente synchronisieren
    Sleep(10);                 // etwas warten VCLSync
  end;
end;

procedure Thread_Nr_02.Hauptprogramm;
var zahlenwert : integer;
begin
  zahlenwert := 0;
  zahlenwert := StrToInt(Form1.Edit1.Text);
  if zahlenwert < 10 then begin
    Form1.Edit1.Text := intotostr(zahlenwert + 1);
    //Form1.Edit1.Text := '1';
  end;

  Terminate;                       // Thread beenden
end;

// Button 3 Click
procedure TForm1.Button3Click(Sender: TObject);
var Th: Thread_Nr_02;
begin
  Th := Thread_Nr_02.Create(True); // Thread erzeugen (suspended)
  Th.FreeOnTerminate := True;     // Thread gibt sich selbst frei
  Th.Resume;                      // Thread starten
end;

end.

xaromz 1. Aug 2006 18:31

Re: thread
 
Hallo,

für diese Routinen musst Du die Unit "SysUtils" einbinden.

Gruß
xaromz

Nisbo 1. Aug 2006 18:37

Re: thread
 
vielen dank, darauf muß man erstmal kommen

Nisbo 1. Aug 2006 19:27

Re: thread
 
ok habe das ganze jetzt in mein hauptprogramm eingebaut und der aufruf klappt auch, allerdings hängt das programm immer noch als ob es keinen thread geben würde

hier der teil vom programm incl dem threadbereich

Delphi-Quellcode:
// Thread 2 START Thread 2 START Thread 2 START Thread 2 START
type
  Thread_Nr_02 = class(TThread)
    procedure Hauptprogramm;
    procedure Execute; override;
  end;

procedure Thread_Nr_02.Execute;
begin
  while not Terminated do begin
    Synchronize(Hauptprogramm);
  end;
end;

procedure Thread_Nr_02.Hauptprogramm;
var
  data: TIdMultiPartFormDataStream;
  dieurl : string;
  A: TStrArray;
  AnzTokens, i, ccc, ccc2: Integer;
  csv: TStringList;
begin
  Screen.Cursor := crHourGlass;
  data := TIdMultiPartFormDataStream.Create;
  dieurl := Form1.Edit1.Text;
  try
    data.AddFormField('id', '1');
    Form1.Memo1.Text := Form1.IdHTTP1.Post(dieurl, data);
    Form1.Memo1.Lines.SaveToFile('shops.txt');
  finally
    data.Free;
  end;

  ccc := -1;
  if FileExists('shops.txt') then begin
    csv := TStringList.Create;
    csv.LoadFromFile('shops.txt');
    Form1.StringGrid1.Rowcount := csv.Count;

    for ccc2 := csv.Count - 1 downto 1 do begin
      AnzTokens := Explode(A, ';', csv.Strings[ccc2]);
      for i := 0 to AnzTokens -1 do begin
        ccc := ccc + 1;
        if ccc < 6 then begin Form1.StringGrid1.Cells[ccc, ccc2] := A[i]; end;
        if ccc = 6 then begin ccc := -1; end;
      end;
    end;
  end;
  Screen.Cursor := crDefault;
  Terminate;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Th: Thread_Nr_02;
begin
  Th := Thread_Nr_02.Create(True); // Thread erzeugen (suspended)
  Th.FreeOnTerminate := True;     // Thread gibt sich selbst frei
  Th.Resume;                      // Thread starten
end;
was habe ich denn jetzt schon wieder falsch gemacht ?

TBx 1. Aug 2006 19:34

Re: thread
 
Zitat:

Zitat von Nisbo
jetzt stellt sich aber die frage warum eine standardfunktion wie strtoint oder inttostr nicht funktioniert, bekomme da nur undefinierter bezeichner

na, weil Du wohl die entsprechende Unit nicht angemeldet hast.

Kann es jetzt aus dem Kopf nicht genau sagen, ich glaube, es war StrUtils. Die OH wird Dir da sicher weiterhelfen.

Gruß

onlinekater

Nisbo 1. Aug 2006 19:39

Re: thread
 
mm was anmelden ?

habe die selben units drinn (und mehr) wie im demoprogramm was hier gepostet wurde

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  IdBaseComponent, IdComponent, IdTCPConnection, idURI, IdMultipartFormData,
  IdTCPClient, IdHTTP,
  StdCtrls, Grids, ComCtrls;
zu StrUtils findet die OH leider nichts, und ansonsten weiß ich ja nicht wonach ich suchen muß


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:36 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz