Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 套接字:如何不停地同时执行两个线程?_Multithreading_Sockets_Delphi - Fatal编程技术网

Multithreading 套接字:如何不停地同时执行两个线程?

Multithreading 套接字:如何不停地同时执行两个线程?,multithreading,sockets,delphi,Multithreading,Sockets,Delphi,在客户机-服务器之间的套接字连接中,我在一个线程(在一个循环中)中接收有关远程pc的信息,在另一个线程中接收其他特定信息 我的问题是,当创建第二个线程时,第一个线程会立即停止,但我希望使用第二个线程接收的信息需要一个循环,如下代码所示 那么,如何在不停止某个线程的情况下同时执行两个线程呢 // Entry point of first thread procedure TSock_Thread2.Execute; var s: String; be

在客户机-服务器之间的套接字连接中,我在一个线程(在一个循环中)中接收有关远程pc的信息,在另一个线程中接收其他特定信息

我的问题是,当创建第二个线程时,第一个线程会立即停止,但我希望使用第二个线程接收的信息需要一个循环,如下代码所示

那么,如何在不停止某个线程的情况下同时执行两个线程呢

    // Entry point of first thread

    procedure TSock_Thread2.Execute;
     var
     s: String;

    begin
      inherited;

      while not Terminated and Socket.Connected do
      begin
        if Socket.ReceiveLength > 0 then
        begin
          s := Socket.ReceiveText;

          if Pos('<|CUR|>', s)>0 then begin

          TSTMouse := TSock_Thread5.Create(Socket);
          TSTMouse.Resume;

          Socket.SendText('<|GETCURSORICON|>'); // after this line, TSock_Thread2 stop your execution 

          end;

       end;
    end;



// Entry point of second Thread

    procedure TSock_Thread5.Execute;
    var
    s, Ponteiro: string;

    begin
      inherited;

        while not Terminated and Socket.Connected do
          begin

            if Socket.ReceiveLength > 0 then
            begin
              s := Socket.ReceiveText;

              if Pos('<|MOUSEICON|>', s) > 0 then // receiving mouse icon here
              begin

                Delete(s, 1, Pos('<|MOUSEICON|>', s) + 12);
                Ponteiro := Copy(s, 1, Pos('<|>', s) - 1);

                if Ponteiro <> '' then

                (Form1.LV1.Selected.SubItems.Objects[2] as TForm2).lblPoint.Caption := Ponteiro;

                Sleep(100);
                Socket.SendText('<|GETCURSORICON|>'); // request cursor icon again

              end;

            end;
          end;

        end;
//第一个线程的入口点
程序TSock_Thread2.Execute;
变量
s:字符串;
开始
继承;
而未端接和套接字。已连接吗
开始
如果Socket.ReceiveLength>0,则
开始
s:=Socket.ReceiveText;
如果位置(“”,s)>0,则开始
TSTMouse:=TSock_Thread5.创建(套接字);
TSTMouse.Resume;
Socket.SendText(“”);//在这一行之后,TSock_Thread2停止执行
结束;
结束;
结束;
//第二个线程的入口点
程序TSock_Thread5.Execute;
变量
s、 庞泰罗:弦;
开始
继承;
而未端接和套接字。已连接吗
开始
如果Socket.ReceiveLength>0,则
开始
s:=Socket.ReceiveText;
如果Pos('',s)>0,则//在此处接收鼠标图标
开始
删除(s,1,Pos(“”,s)+12);
Ponteiro:=副本1,位置1;
如果Ponteiro“那么
(Form1.LV1.Selected.SubItems.Objects[2]作为TForm2)。lblPoint.Caption:=Ponteiro;
睡眠(100);
Socket.SendText(“”);//再次请求光标图标
结束;
结束;
结束;
结束;

您有两个线程从一个套接字读取数据?从一开始这通常是个坏主意。如果您真的想这样做,那么就不能让它们同时读取,因为套接字不是这样工作的

任何给定的读取器只能读取下一个字节或字节序列。没有内置控件来说明为哪个线程指定了哪些字节。您需要了解如何同步这两个线程,以便它们都知道何时允许读取

另一个想法是只从套接字读取一个线程。该线程可以读取字节序列,然后将它们分派给其他线程进行处理