Einzelnen Beitrag anzeigen

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