多线程同步问题

解决方案 »

  1.   

    UINT CRWSock::ThreadProc(LPVOID lp)
    {
    // _DATA *dat;
    // dat=(_DATA *)lp;
    _Thread *dat = (_Thread *)lp;
    SmList* pList = NULL;
    // WaitForSingleObject(sem[1],INFINITE);
    CSingleLock singleLock(&sem);
    singleLock.Lock();  // Attempt to lock the shared resource
    if (singleLock.IsLocked())  // Resource has been locked
    {
    sec2.Lock();
    for(int i=0;i<10;i++)
    {
    if(bFlag[i]==true)
    {
    dat->i = i ;
    bFlag[i]= false ;
    pList = &dat->pList[i];
    break; 
    }
    }
    sec2.Unlock();
    if(i==10)
    AfxMessageBox("hcl") ; if(pList == NULL)
    AfxMessageBox("hcl2") ;
    try
    {
    sec.Lock();
    // g_pListRecv->InsertItem(0,dat->szPhone);
    // g_pListRecv->SetItemText(0,1,dat->szContent);
    g_pListRecv->InsertItem(0,dat->data.szPhone);
    g_pListRecv->SetItemText(0,1,dat->data.szContent);
    sec.Unlock(); //处理比赛
    // SmList list;
    // if(!list.IsConnect())
    // {
    // list.Connect();
    // }
    // static SmList list[10];
    SmList::listMsg msg;
    strcpy(msg.szMsg,dat->data.szContent);
    strcpy(msg.szPhone,dat->data.szPhone);// if(!pList->IsConnect())
    // {
    // pList->Connect();
    // }
    if(pList->SaveRecvMsg(&msg) < 0)
    {//SaveRecvMsg error!
    DataBaseError("SaveRecvMsg error!");
    bFlag[dat->i] = true ;
    delete dat;
    return 0;
    }
    bFlag[dat->i] = true ;
    }
    catch(...)
    {
    AfxMessageBox("Thread SaveRecvMsg exception");
    // sec.Lock();
    // g_nSectionCount--;
    // sec.Unlock();
    }

    try
    {
    SmTreat treat; SM sm;
    // strcpy(sm.content,dat->szContent);
    // strcpy(sm.phone,dat->szPhone);
    strcpy(sm.content,dat->data.szContent);
    strcpy(sm.phone,dat->data.szPhone);

    treat.Treat(sm);

    }
    catch(...)
    {
    AfxMessageBox("Thread Treat exception");
    // sec.Lock();
    // g_nSectionCount--;
    // sec.Unlock();
    }
    singleLock.Unlock();
    }
    delete dat;


    return 1;

    }