Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   winsock TSocket und Thread (ThreadBegin) (https://www.delphipraxis.net/166171-winsock-tsocket-und-thread-threadbegin.html)

jokerfacehro 1. Feb 2012 16:50

winsock TSocket und Thread (ThreadBegin)
 
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 ?

jokerfacehro 1. Feb 2012 17:19

AW: winsock TSocket und Thread (ThreadBegin)
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:57 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