AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) winsock TSocket und Thread (ThreadBegin)
Thema durchsuchen
Ansicht
Themen-Optionen

winsock TSocket und Thread (ThreadBegin)

Ein Thema von jokerfacehro · begonnen am 1. Feb 2012 · letzter Beitrag vom 1. Feb 2012
Antwort Antwort
Benutzerbild von jokerfacehro
jokerfacehro

Registriert seit: 13. Feb 2007
306 Beiträge
 
Delphi 7 Enterprise
 
#1

winsock TSocket und Thread (ThreadBegin)

  Alt 1. Feb 2012, 17:50
Hallo liebe DPler

ich habe mal den Code von Sirius ausprobiert, innerhalb einer Klasse in NonVcl-Umgebung.

http://www.delphipraxis.net/1003271-post9.html

Dieser durchlief auch einmal die Schleife und lieferte korrekt die empf. Daten.


Als ich die Schleife in einen Thread ausgelagert hatte, funktionierte das ganze nicht mehr.
Zuerst hatte ich die thread-procedure innerhalb der Klasse.

Danach habe ich dann die Thread-procedure außerhalb der Klasse laufen lassen.

Aber daran lag es auch nicht.


Komischerweise führt er die ersten Zeilen der Thread-procedure aus und springt dann ans ende.


hier etwas code:


Delphi-Quellcode:
//thread record

type TSockData = record
        Sock: TSocket;
        SockEvent: WSAEvent;
        end;





//connect routine

procedure TTCPSocket.ConnectSocket(IP: string; PORT: Integer);
var SockAddr: TSockAddrIn;
    AddrLen: Integer;
    Data: WSAData;
begin

  WSAStartup( MakeWord(2,0), Data);

  Sock := CreateSocket;

  AddrLen := SizeOf( SockAddr );
  SockAddr.sin_family := AF_Inet;
  SockAddr.sin_port := htons( PORT );
  SockAddr.sin_addr.S_addr := inet_addr( PChar(IP) );

  if Connect(Sock, SockAddr, AddrLen) = Socket_Error then
    HandleError;

  SockEvent:=WSACreateEvent; //--->>>> Sock und SockEvent sind global
  WSAEventSelect( Sock, SockEvent, FD_Read);

end;




//Thread

threadvar
  SockPtr : ^TSockData;


procedure ReadSocket(Parameter: Pointer);
var buffer: array[0..511] of Char;
      data: string;
      recvLen, WSAResult: Integer;
      SockEvent: WSAEvent;
begin

  SockPtr := Parameter; //Pointeradresse wurde richtig übergeben

  data := '';

  while true do begin
    WSAResult := WSAWaitForMultipleEvents( 1, @SockPtr.SockEvent, false, infinite, false);

    case WSAResult of //-------->>>> WSAResult gibt -1
      WSA_WAIT_EVENT_0:
      begin

        fillchar(buffer, 512, #0);
        recvLen := recv(SockPtr.Sock, buffer, sizeOf(buffer), 0);
        showmessage(buffer);
        {if recvLen = INVALID_SOCKET then
          HandleERROR;}


        data := data + buffer;
        end;
      else
        break;
    end;

    WSAresetEvent(SockEvent);

    end;

   // OnReceive( data );


  WSACloseEvent(SockEvent);
  WSACleanUp;

// EndThread(0);

end; //--->>> die schleife einfach übersprungen







// start thread

procedure TTCPSocket.StartReading;
var id: LongWord;
    DataBuf: TSockData;
begin
  DataBuf.Sock:=Sock;
  DataBuf.SockEvent:=SockEvent;

  ReadingThread := BeginThread(nil, 0, Addr(ReadSocket), Addr(DataBuf), 0, id);

end;



manchmal springt er garnicht in den thread, manchmal springt er bis WSAResult und von da aus direkt zum ende.



Hat jemand von euch eine Idee ?
"Never touch a running system administrator !"

Geändert von jokerfacehro ( 1. Feb 2012 um 17:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jokerfacehro
jokerfacehro

Registriert seit: 13. Feb 2007
306 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: winsock TSocket und Thread (ThreadBegin)

  Alt 1. Feb 2012, 18:19
Ok, ich habe den Fehler gefunden.

Ich habe Sock und SockEvent global gesetzt und somit brauchte ich keine Parameter übergeben.

Allerdings frage ich mich, was ich falsch mache, bei der Parameterübergabe für den Thread.
"Never touch a running system administrator !"
  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 12:40 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