Wie Critical verwenden - MFC?
-
02-10-2019 - |
Frage
I‘ist auf einem kleines Beispiel arbeitet und ist ein bisschen neugierig mit Critical in meinem Beispiel. Was Ich bin zu tun ist, ich habe eine CStringArray (die ihm hinzugefügt 10 Elemente hat) .Ich kopieren möchten diese 10 Elemente (string) in einem anderen CStringArray (tun das Einfädeln und kritische Abschnitte zu verstehen), ich habe zwei Threads erstellt, Thread1 wird das erste 5-Element auf ein anderes CStringArray und Thread2 kopieren Sie die rest.Here zwei CStringArray kopiert werden eingesetzt, , ich weiß nur 1 Thread kann es bei einem time.I Zugriff wissen wollte, wie dies kann durch die Verwendung Critical oder andere Verfahren gelöst werden.
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);
}
}
Lösung
So wie ich ein Critical verwenden würde, ist:
-
Deklarieren Sie eine Membervariable in Ihrer
CThreadingEx4Dlg
Klasse:CCriticalSection m_CriticalSection;
-
Schliessen Sie Ihren nicht sicheren Code in einem Lock-Entsperren Block dieses Critical Gewinde:
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(); }
Andere Tipps
Erwägen Sie die Verwendung CSingleLock so dass der Konstruktor kümmert sich um die Verriegelung und die destructor kümmert sich automatisch um die Entriegelung
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
}