0

我有 2 个线程,第一个正在做:`

while(1){

    if(recv(conn_s, (char*) &i, sizeof(i),0)>0){

        if(i==28){
            SetEvent(event);
            //printf("nell if di 28\n");
            HANDLE t;
            sleep(1);
            //TerminateThread(scegli, 0);
            //if (CloseHandle(scegli)==0) printf("error close\n");
            t=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) avvia_conversazioneCl, conn, SYNCHRONIZE, 0);
            WaitForSingleObject(t, INFINITE);

第二个:

       const HANDLE handles[2]={event, stdinHandle};

       while(1){

            switch(WaitForMultipleObjects(num, handles, FALSE, 0)){
                case 0: 

                        ExitThread(-1);
                        break;

                case 1:
                                    r=ReadConsole(stdinHandle, &interlocutore, nLength, &charsRead, NULL);
                                    if (r==0){
                                        printf("%d\n", GetLastError());
                                    }
                                    //global_value_to_exit=1;
                                    int size=strlen(interlocutore);
                                     interlocutore[size-2]='\0';

                                    int verifica=verifica_interlocutore(interlocutore); 
                                     if (verifica==0){
                                         printf("interlocutore non disponibile, riprova: \n");
                                         continue;
                                    }



                                    int rrr=send(socket, interlocutore, size, 0);
                                    if (rrr<=0){
                                        printf("send error\n");
                                    }
                                    sleep(1);
                                    if(recv(socket, (char*) &ack, sizeof(int), 0)==SOCKET_ERROR){
                                        printf("errore: %d\n", WSAGetLastError());
                                    }
                                    printf("ho ricevuto %d\n", (int) ack);
                                    if(ack==999){

                                        //sleep(1);
                                         HANDLE t;
                                        DWORD tID;
                                        t=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) avvia_conversazioneCl, conn_s, 0, &tID);
                                        WaitForSingleObject(t, INFINITE);
                                        CloseHandle(t);
                                        //global_value_to_exit=0;
                                        ack=0;
                                        vis=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) visualizza_utenti, conn_s, 0, &visID);
                                     }
                                     //ResetEvent(stdinHandle);
                                     break;

                case WAIT_FAILED: 
                                perror("failed: \n");

                                break;
    }

    memset(interlocutore, 0, sizeof(interlocutore));
}

    return NULL;

}

还:

  const HANDLE handles[2]={event, stdinHandle};

   event=CreateEvent(NULL, FALSE, FALSE, NULL);

   stdinHandle=GetStdHandle(STD_INPUT_HANDLE);`

关键是:如果我在控制台中写一些东西,我会用第二个线程做事,如果我得到 28 的接收,我想让第二个线程退出,所以我设置为信号事件。此时使用 waitformultipleobjects 我应该进入 case 0 并退出线程。相反,在我已经接收 28 并更改了事件的状态之后,如果我在控制台中写了一些东西,第二个线程进入案例 1。在写了其他东西之后,它似乎已经死了

有什么建议吗?

4

0 回答 0