Threads,SetThreadAffinityMask, und Progress Control
-
Hallo alle!
Ich habe ein Program geschrieben - Multithreads. Dort ist KlasseCThreadDlg, drei Funktionen - Process(Deklarationen):
DWORD WINAPI MyThread1(LPVOID pParam1); DWORD WINAPI MyThread2(LPVOID pParam2); DWORD WINAPI MyThread3(LPVOID pParam3);Gründliche Beschreibung (dritte Funktion):
DWORD WINAPI MyThread3(LPVOID pParam3) { CThreadDlg * pObject3 = (CThreadDlg*) pParam3; pObject3->m_PROGRESS3_CTRL.SetRange(0,50000); pObject3->m_PROGRESS3_CTRL.SetStep(1); for (int i=0; i<50000; i++){ pObject3->m_PROGRESS3_CTRL.StepIt(); pObject3->SetDlgItemInt(IDC_EDIT16, i); //printf("Labas %d", i); //(pObject->m_Edit15_CTRL) = i; } return 0; }Diese Funktionen aktiviere ich, wenn die folgende Taste drücke
void CThreadDlg::OnBnClickedButton3() { HANDLE hThread[MAX_THREADS]; DWORD dwThreadID[MAX_THREADS]; for (int index=0; index<MAX_THREADS;index++) { hThread[index] = CreateThread( NULL, 0, MyThread3, (LPVOID)this, 0, &dwThreadID[index] ); if( bThread3Run == 0) //START state { SetDlgItemTextW(IDC_BUTTON3, L"PAUSE"); if(SetThreadAffinityMask(hThread[index], m_COMBO3_CTRL.GetCurSel( )+1)== NULL) MessageBoxW(L"Error in Set of Processors", L"Error", 0); int nummerActualCombo3 = m_COMBO6_CTRL.GetCurSel( ); int prioritat3=0; switch(nummerActualCombo3) { case 0: prioritat3 = 1; break; case 1: prioritat3 = -1; break; case 2: prioritat3 = 2; break; case 3: prioritat3 = -15; break; case 4: prioritat3 = -2; break; case 5: prioritat3 = 0; break; case 6: prioritat3 = 15; break; } SetThreadPriority(hThread[index],prioritat3); bThread3Run = 1; } else if (bThread3Run == 1)//PAUSE state { SetDlgItemTextW(IDC_BUTTON3, L"RESUME"); int klaida = SuspendThread(hThread[index]); SetDlgItemInt(IDC_EDIT16, klaida); bThread3Run = 2; } else if (bThread3Run == 2)//RESUME state { SetDlgItemTextW(IDC_BUTTON3, L"START"); ResumeThread(hThread[index]); bThread3Run = 0; } } for (int index=0; index<MAX_THREADS; index++) CloseHandle(hThread[index]); UpdateData(TRUE); }Hier ist ein Problem. in Funktion CreateThread() wie Argument hinweise ich
(LPVOID)this- Nummer des Threads. Alles arbeitet bis dann, wenn ich in der Funktionenbeschreibung diese Funktion fur Progress Control
pObject3->m_PROGRESS3_CTRL.SetRange(0,50000); pObject3->m_PROGRESS3_CTRL.SetStep(1); pObject3->m_PROGRESS3_CTRL.StepIt();verwende. Danach SetThreadAffinityMask() funktioniert nicht. Was ist denn los?
Danke
-
1. Vergiss SetThreadAffinityMask einfach. Windows weiß selbst besser wie es Threads zuweist und vorhält.
2. Fenster Objekte die von CWnd's abgeleitet sind darfst Du nur in dem Thread verwenden, in dem diese auch angelegt wurden! Andernfalls hagelt es oft genug von ASSERT's
3. Wenn Du ein Fenster Objekt aus einem Thread ansprichst, der das Fenster nicht erzeugt hat, werden alle Fensterbefehle/Nachrichten in die Message Queue eingestellt. Deine ganzen Fenster-Operationen im Thread erzeugen eine Fensternachricht die in die Queue eingestellt werden und anschließend wartet der Thread auf die Erledigung dieser Nachricht. Läuft keine Nachrichtenschleife, bzw. wird die Nachricht nicht beantwortet, steht der Thread für immer.
-
vielen Dank fur die Antwort! Aber ich moechte etwas zusatzlich sagen:
1. SetAffienityMask muss ich benutzen, weil solche Aufgabe ich habe, deswegen soll ich unbedingt das erledigen.
2. Ich habe noch die Probleme mit den SuspndThread und ResumeThread. Diese Funktionen arbeitet gar nicht... Aber ich bekomme keine Fehlermeldung. Varscheinlich haben Sie bemerkt, dass im Kode ich 3 Tasten implementiert habe - START, PAUSE, RESUME. Also, ich verstehe nicht, warum das nicht funktioniert. Könnten Sie etwas empfehlen ( Lösung, oder andere Funktionion...)
Vielen Dank!
-
1. Lass SetThreadAfinityMask einfach bleiben. Es bringt nichts. Auch wenn das einer sagt.
2. SuspendThread ist tödlich. Arbeite besser mit Events u einen Thread anzuhalten.
http://blog.kalmbachnet.de/?postid=6Ansonsten, was sagt GetLastError?
-
ja, mit SuspendThread() und ResumeThread() funktioniert alles gar nicht gut... Aber das ist egal.
Es ist mehr interessant, was genau passiert, wenn ich 2 verschiedene Threads für z.B. Prozessor 2 die Aufgabe beauftrage. Ich habe bemerkt, dass nur dieser Prozessor arbeitet. Das bedeutet, dass Prozessor 2 beide Threads abwechselnd bearbeitet?Also, und eine Frage aus anderem Gebiet (aber in dieser Arbeit):
Ich rechne solche Algorithmus 2^N, wo N kann sehr gross sein. Die Angaben speichere ich in einer Array. Dann möchte ich diese Array in "Edit Box" darstellen. Aber wieso? In "Edit Box" Properties habe ich Multiline auf TRUE gewählt. Also endlich habe ich ein Array (z.B. A[1000]). Und wieso in einem Takt ich dass darstellen kann?pObject2->SetDlgItemInt(IDC_EDIT2, ???);Mit der Schleife ...A[i]... geht es nicht, natürlich..
Vielen Dank!!
-
Also, ich habe die Lösung gefunden. Ich mache Edit Box "CString" Format. Dann benutze folgende variablen:
CString s,x;
und Format() Funktiont.Format("%d",A[i]aber ich bekomme diesen Fehler:
threaddlg.cpp(58) : error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : cannot convert parameter 1 from 'const char [3]' to 'const wchar_t *'
Also, was kann ich tun?
Vielen Dank
-
wenn jemand dieses Problem bekommt, muss so machen.
Format(_T("%d"),...)
_T() konvertiert Kode.