2010-05-04 4 views
2

Je travaille sur un petit exemple et suis un peu curieux en utilisant la section critique dans mon exemple. Qu'est-ce que je suis, je ai un CStringArray (qui a 10 éléments ajoutés) .Je veux copier ces 10 éléments (chaîne) à un autre CStringArray (je fais cela pour comprendre la section Threading et critique), j'ai Thread1 copiera le premier 5 élément à un autre CStringArray et Thread2 copiera le reste. Deux CStringArray sont utilisés, je sais que seulement 1 thread peut y accéder à la fois. Je voulais savoir comment cela peut être résolu par utilisant la section critique ou toute autre méthode.Comment utiliser CriticalSection - MFC?

void CThreadingEx4Dlg::OnBnClickedOk() 
{ 
    // TODO: Add your control notification handler code here 
    thread1 = AfxBeginThread((AFX_THREADPROC)MyThreadFunction1,this); 
    thread2 = AfxBeginThread((AFX_THREADPROC)MyThreadFunction2,this); 
} 
UINT MyThreadFunction1(LPARAM lparam) 
{ 
    CThreadingEx4Dlg* pthis = (CThreadingEx4Dlg*)lparam; 

    pthis->MyFunction(0,5); 
    return 0; 
} 
UINT MyThreadFunction2(LPARAM lparam) 
{ 
    CThreadingEx4Dlg* pthis = (CThreadingEx4Dlg*)lparam; 
    pthis->MyFunction(6,10); 
    return 0; 
} 

void CThreadingEx4Dlg::MyFunction(int minCount,int maxCount) 
{ 
    for(int i=minCount;i<=maxCount;i++) 
    { 
     CString temp; 
     temp = myArray.GetAt(i); 
     myShiftArray.Add(temp); 
    } 
} 

Répondre

2

La façon dont j'utiliser un CriticalSection est:

  • Déclarez une variable membre dans votre CThreadingEx4Dlg classe:

    CCriticalSection m_CriticalSection; 
    
  • Entourez votre fil pas de code en toute sécurité dans une serrure -Déverrouiller le bloc de cette section critique:

    void CThreadingEx4Dlg::MyFunction(int minCount,int maxCount) 
    { 
        m_CriticalSection.Lock(); 
        for(int i=minCount;i<=maxCount;i++) 
         myShiftArray.Add(myArray.GetAt(i)); 
        m_CriticalSection.Unlock(); 
    } 
    
+0

des thats bon .... merci pour votre réponse – mapples

0

Envisagez d'utiliser CSingleLock afin que le constructeur prend en charge le verrouillage et l'destructor prend automatiquement en charge le déverrouillage

void CThreadingEx4Dlg::MyFunction(int minCount,int maxCount) 
{ 
    CSingleLock myLock(&m_CriticalSection, TRUE); 

    // do work here. 

    // The critical section will be unlocked when myLock goes out of scope 
} 
+0

évitent généralement le code uniquement des réponses . Pensez à ajouter une 'description' qui aide à expliquer votre code. Merci – MickyD