Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 线程中止和线程退出不工作visualstudio2008 c++;_Multithreading_Visual Studio 2008_C++ Cli_Threadabortexception_Thread Abort - Fatal编程技术网

Multithreading 线程中止和线程退出不工作visualstudio2008 c++;

Multithreading 线程中止和线程退出不工作visualstudio2008 c++;,multithreading,visual-studio-2008,c++-cli,threadabortexception,thread-abort,Multithreading,Visual Studio 2008,C++ Cli,Threadabortexception,Thread Abort,我在C++ VisualStudio2008中使用线程,当我的窗体关闭时,线程仍然保持活动状态,所以我尝试了线程::在窗体关闭时中止:但是在调用线程仍然活着之后。因此,我将am EXCTION处理程序放在线程中,当异常终止时,线程退出,但线程不进入异常处理程序。 我怎样才能合上我的线? oThread是一个全局对象线程 private: void ThreadMethod(/*Object^ state*/) { try{ SOCKET server; WSADAT

我在C++ VisualStudio2008中使用线程,当我的窗体关闭时,线程仍然保持活动状态,所以我尝试了线程::在窗体关闭时中止:但是在调用线程仍然活着之后。因此,我将am EXCTION处理程序放在线程中,当异常终止时,线程退出,但线程不进入异常处理程序。 我怎样才能合上我的线? oThread是一个全局对象线程

private: void ThreadMethod(/*Object^ state*/)
{   
    try{
    SOCKET server;
    WSADATA wsaData;
    sockaddr_in local;
    int wsaret=WSAStartup(0x101,&wsaData);
    if(wsaret!=0)
    {
        return;
    }
    local.sin_family=AF_INET;
    local.sin_addr.S_un.S_addr=INADDR_ANY;
    local.sin_port=htons((u_short)20248);
    server=socket(AF_INET,SOCK_STREAM,0);
    if(server==INVALID_SOCKET)
    {
        return;
    }
    if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
    {
        return;
    }
    if(listen(server,10)!=0)
    {
        return;
    }
    SOCKET client;
    sockaddr_in from;
    int fromlen=sizeof(from);
    int buffer;
    char buff;
    //this->Invoke(gcnew MethodInvoker(this, &Form1::UpdateButton));
    while(!stop)
    {
        client=accept(server,(struct sockaddr*)&from,&fromlen);
        //con la struct
        int numByte=recv(client,(char*) &mystruct, (int) sizeof(mystruct), 0);
        this->Invoke(gcnew MethodInvoker(this, &Form1::UpdateButton));
        MessageBox::Show(mystruct.num.ToString());
        closesocket(client);

    }
    closesocket(server);
    WSACleanup();
    }
    catch (ThreadAbortException^ e) 
    {
        ExitThread(0);
    }
    ExitThread(0);
}

private: System::Void Form1_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) {     
         oThread->Abort(); 
         if(oThread->IsAlive)
         {
             MessageBox::Show("ok");
         }
     }
};
}

像这样的怎么样:

// Make socket non-blocking
int mode = 1;
ioctlsocket(server, FIONBIO, &mode);

struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 100000;  // 0.1 second

FD_SET server_set;

while (!stop)
{
    FD_ZERO(&server_set);
    FD_SET(server, &server_set);

    if (select(server + 1, &server_set, 0, 0, &timeout) == SOCKET_ERROR)
    {
        // Error handling
    }

    if (FD_ISSET(server, &server_set))
    {
        // Call accept and all the other stuff
    }
}

像您一样使用循环检查变量(在您的情况下是
stop
)是一种常见的方法。你在任何地方设置了这个变量吗?是的,但我不能这样做,因为线程正在停止并侦听TCP数据包,所以我需要以其他方式停止线程。这就是我尝试使用abort或exit的原因。但是,如果您有一个包含变量和非阻塞侦听的解决方案,它将是OK使侦听套接字非阻塞,并使用
选择
和一个短超时来检查侦听套接字上的活动。这样,循环将以短暂的暂停运行,这不会最大限度地提高CPU的使用率。对不起,我不是套接字专家,你能写一个简单的例子吗,就用几行代码使侦听不阻塞吗?非常感谢。