PHP Forum - Coding Board
November 20, 2017, 01:10:21 *
Willkommen Gast. Bitte einloggen oder registrieren.

Einloggen mit Benutzername, Passwort und Sitzungslänge
News:
 
   Übersicht   Hilfe Suche Einloggen Registrieren  
Seiten: [1]
  Drucken  
Autor Thema: [S] Hilfe bei Threads mit Delphi  (Gelesen 75 mal)
0 Mitglieder und 1 Gast betrachten dieses Thema.
CoolObsession
Full Member
***
Beiträge: 236


848620
Profil anzeigen E-Mail
« am: März 17, 2009, 08:09:05 »

CODE]unit Unit3;

interface

uses
  Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF},IdMultipartFormData,IdHttp,
  IdComponent, IdTCPConnection, IdTCPClient,StrUtils,forms,unit1,unit2;

type
TArrayofstring = array of string;
  upload = class(TThread)
  IdHTTP1: TIdHTTP;
  private
    procedure SetName;
  protected
    procedure Execute; override;
  end;

implementation

{ Wichtig: Methoden und Eigenschaften von Objekten in visuellen Komponenten dürfen
  nur in einer Methode namens Synchronize aufgerufen werden, z.B.

      Synchronize(UpdateCaption);

  und UpdateCaption könnte folgenderma?en aussehen:

    procedure upload.UpdateCaption;
    begin
      Form1.Caption := 'Aktualisiert in einem Thread';
    end; }

{$IFDEF MSWINDOWS}
type
  TThreadNameInfo = record
    FType: LongWord;     // muss 0x1000 sein
    FName: PChar;        // Zeiger auf Name (in Anwender-Adress-Bereich)
    FThreadID: LongWord; // Thread-ID (-1 ist Caller-Thread)
    FFlags: LongWord;    // reserviert für zukünftige Verwendung, muss 0 sein
  end;
{$ENDIF}

{ upload }

procedure upload.SetName;
{$IFDEF MSWINDOWS}
var
  ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
  ThreadNameInfo.FType := $1000;
  ThreadNameInfo.FName := 'upload';
  ThreadNameInfo.FThreadID := $FFFFFFFF;
  ThreadNameInfo.FFlags := 0;

  try
    RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
  except
  end;
{$ENDIF}
end;

function FindInString(Text, SearchFrom, SearchTo: string; FirstOnly: Boolean; var Return: TArrayOfString): Boolean;
var
  i: Integer;
  FoundString: string;
begin
  Result := False;
  SetLength(Return, 0);
  i := Pos(SearchFrom, Text);
  while i > 0 do
  begin
    Result := True;
    i := i + Length(SearchFrom);
    FoundString := Copy(Text, i, PosEx(SearchTo, Text, i) - i);
    SetLength(Return, Length(Return) + 1);
    Return[High(Return)] := FoundString;
    Delete(Text, 1, i);
    i := Pos(SearchFrom, Text);
    if FirstOnly then
      Break;
  end;
end;



procedure upload.Execute;
var
s:string;
after:tarrayofstring;
stream: TIdMultiPartFormDataStream;
begin
  SetName;
 




if form2.radiobutton1.Checked then
begin

s:=('http://www.imagebanana.com/');

stream := TIdMultiPartFormDataStream.Create;

Stream.AddFormField('send','Hochladen!');
Stream.AddFile('img','23.jpg', 'multipart/form-data');

s:=IdHTTP1.Post(s,Stream);
form1.memo1.text:=s;
FindInString (form1.memo1.text,'[img=','][/url]"',true,after);
form1.edit1.text:=after[0];
end;
end;

end.
[/CODE]

Wie kriege ich mein Programm jetHigh(Return)] := FoundString;
    Delete(Text, 1, i);
    i := Pos(SearchFrom, Text);
    if FirstOnly then
      Break;
  end;
end;



procedure upload.Execute;
var
s:string;
after:tarrayofstring;
stream: TIdMultiPartFormDataStream;
begin
  SetName;
 




if form2.radiobutton1.Checked then
begin

s:=('http://www.imagebanana.com/');

stream := TIdMultiPartFormDataStream.Create;

Stream.AddFormField('send','Hochladen!');
Stream.AddFile('img','23.jpg', 'multipart/form-data');

s:=IdHTTP1.Post(s,Stream);
form1.memo1.text:=s;
FindInString (form1.memo1.text,'[img=','][/url]"',true,after);
form1.edit1.text:=after[0];
end;
end;

end.


Wie kriege ich mein Programm jetzt dazu das der Thread ausgeführt wird. Ich glaube ich habe schon im Thread fehler gemacht, aber im Internet finde ich einfach nichts das leicht verständlich ist.

Also wie bekomme ich den Code ausgeführt das ich am Ende das Ergebniss in meinem Hauptfenster habe?
Gespeichert

[B] RS, Freundin, Altpapier, Datenbanken
[S] Nichts
berlinermauer
Full Member
***
Beiträge: 129


Profil anzeigen E-Mail
« Antworten #1 am: März 17, 2009, 08:16:36 »

Also ich habe das so gemacht :

[Delphi]
var
ThreadID: DWORD;       //Thread-ID
ThreadHandle: THandle; //Rückgabewert von CreateThread

function ISGAY // Blah Blah Blub^^ du brauchst afaik ne Function

hreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@ISGAY),nil, 0, ThreadID);

  //wenn der Thread erfolgreich gestartet wurde (ThreadHandle<>0), können
  //wir ThreadHandle wieder freigeben:
  if ThreadHandle<>0 then CloseHandle(ThreadHandle);
Gespeichert


CoolObsession
Full Member
***
Beiträge: 236


848620
Profil anzeigen E-Mail
« Antworten #2 am: März 17, 2009, 08:23:12 »

Ist ziemlich kreuz und quer ^^ Verstehe nur die häflte haste vllt nen source schnipsel von dir wo es aufgerufen wird?
Gespeichert

[B] RS, Freundin, Altpapier, Datenbanken
[S] Nichts
berlinermauer
Full Member
***
Beiträge: 129


Profil anzeigen E-Mail
« Antworten #3 am: März 17, 2009, 08:29:44 »

hab ich doch.

also du brauchst zwei variabeln

dann ne Funktion muss exsistieren

und dann :

Code:
ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@Funktionsname),nil, 0, ThreadID);

//wenn der Thread erfolgreich gestartet wurde (ThreadHandle<>0), können
//wir ThreadHandle wieder freigeben:
if ThreadHandle<>0 then CloseHandle(ThreadHandle);
Gespeichert


CoolObsession
Full Member
***
Beiträge: 236


848620
Profil anzeigen E-Mail
« Antworten #4 am: März 17, 2009, 08:38:47 »

OK Danke das war verständlicher
Gespeichert

[B] RS, Freundin, Altpapier, Datenbanken
[S] Nichts
Zacherl
Entwickler Team
Moderator
Sr. Member
****
Beiträge: 454



Profil anzeigen E-Mail
« Antworten #5 am: März 17, 2009, 08:55:44 »

Das ThreadHandle würde ich nicht manuell freigeben. Dürfte beim Aufruf von ExitThread (Delphi müsste das automatisch nach dem Abarbeiten des Thread Codes aufrufen) sowieso geschlossen werden. Mit dem Handle könnte mann über TerminateThread() nämlich den Thread bei Bedarf auch abbrechen.

Allerdings sind das nun Threads auf Win API Basis und nicht das TThread Object. Beim TThreadObject musst du eine Klasse von TThread ableiten und die Execute Methode überschreiben. Dann erzeugst du ein Objekt vom Typ TMyThread (also deine neue Klasse) entweder mit TRUE als Parameter oder mit FALSE und rufst danach Resume auf.
Gespeichert

Seiten: [1]
  Drucken  
 
Gehe zu:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | New Look by Nolt Prüfe XHTML 1.0 Prüfe CSS