
- •1. Синхронизирующие объекты
- •1.1. Критические разделы
- •Синхронизация потоков с объектами ядра
- •2.1. Объекты mutex
- •2.2.Семафоры
- •2.3.События
- •2.4.События со сбросом вручную
- •2.5.События с автоматическим сбросом
- •InitializeCriticalSection(&g_CriticalSection);
- •0, &DwThreadId);
- •0, &DwThreadId);
- •Void Dlg_OnDestroy (hwnd hwnd) {
- •Void Dlg_OnCommand (hwnd hwnd, int id, hwnd hwndCtl,
- •If (Button_GetCheck(hwndCtl)) {
- •Int winapi WinMain (hinstance hinstExe,
InitializeCriticalSection(&g_CriticalSection);
// Создаем поток с функцией CounterThread и запускаем его
g_hThreadCntr = BEGINTHREADEX(NULL, 0, CounterThread, NULL,
0, &DwThreadId);
// Создаем поток с функцией DisplayThread и запускаем его
g_hThreadDspy = BEGINTHREADEX(NULL, 0, DisplayThread, NULL,
0, &DwThreadId);
// Заполняем комбинированный список Process Priority Class и выбираем Normal
hWndCtl = GetDlgItem(hwnd, IDC_PRIORITYCLASS);
ComboBox_AddString(hWndCtl, __TEXT("Idle"));
ComboBox_AddString(hWndCtl, __TEXT("Normal"));
ComboBox_AddString(hWndCtl, __TEXT("High"));
ComboBox_AddString(hWndCtl, __TEXT("Real time"));
ComboBox_SetCurSel(hWndCtl, 1); // Normal
// Заполняем комбинированный список Display Thread Priority и выбираем Normal
hWndCtl = GetDlgItem(hwnd, IDC_DSPYTHRDPRIORITY);
ComboBox_AddString(hWndCtl, __TEXT("Idle"));
ComboBox_AddString(hWndCtl, __TEXT("Lowest"));
ComboBox_AddString(hWndCtl, __TEXT("Below normal"));
ComboBox_AddString(hWndCtl, __TEXT("Normal"));
ComboBox_AddString(hWndCtl, __TEXT("Above normal"));
ComboBox_AddString(hWndCtl, __TEXT("Highest"));
ComboBox_AddString(hWndCtl, __TEXT("Timecritical"));
ComboBox_SetCurSel(hWndCtl, 3); // Normal
// Заполняем комбинированный список Counter Thread Priority и выбираем Normal
hWndCtl = GetDlgItem(hwnd, IDC_CNTRTHRDPRIORITY);
ComboBox_AddString(hWndCtl, __TEXT("Idle"));
ComboBox_AddString(hWndCtl, __TEXT("Lowest"));
ComboBox_AddString(hWndCtl, __TEXT("Below normal"));
ComboBox_AddString(hWndCtl, __TEXT("Normal"));
ComboBox_AddString(hWndCtl, __TEXT("Above normal"));
ComboBox_AddString(hWndCtl, __TEXT("Highest"));
ComboBox_AddString(hWndCtl, __TEXT("Timecritical"));
ComboBox_SetCurSel(hWndCtl, 3); //Normal
return(TRUE);
}
//////////////////////////////////////////////////////////////////
Void Dlg_OnDestroy (hwnd hwnd) {
// Когда диалоговое окно закрывается, завершаем оба потока и удаляем критический
// раздел
TerminateThread(g_hThreadDspy, 0);
TerminateThread(g_hThreadCntr, 0);
DeleteCriticalSection(&g_CriticalSection);
}
///////////////////////////////////////////////////////////////////
Void Dlg_OnCommand (hwnd hwnd, int id, hwnd hwndCtl,
UINT codeNotify) {
HANDLE hThread;
DWORD dw;
switch (id) {
case IDCANCEL:
EndDialog(hwnd, id);
break;
case IDC_DSPYTHRDPRIORITY:
case IDC_CNTRTHRDPRIORITY:
if (codeNotify != CBN_SELCHANGE)
break;
switch (ComboBox_GetCurSel(hwndCtl)) {
case 0:
dw = (DWORD) THREAD_PRIORITY_IDLE;
break;
case 1:
dw = (DWORD) THREAD_PRIORITY_LOWEST;
break;
case 2:
dw = (DWORD) THREAD_PRIORITY_BELOW_NORMAL;
break;
case 3:
default:
dw = (DWORD) THREAD_PRIORITY_NORMAL;
break;
case 4:
dw = (DWORD) THREAD_PRIORITY_ABOVE_NORMAL;
break;
case 5:
dw = (DWORD) THREAD_PRIORITY_HIGHEST;
break;
case 6:
dw = (DWORD) THREAD_PRIORITY_TIME_CRITICAL;
break;
}
// Пользователь меняет относительный приоритет одного из потоков
hThread = (id == IDC_CNTRTHRDPRIORITY) ?
g_hThreadCntr : g_hThreadDspy;
SetThreadPriority(hThread, dw);
break;
case IDC_PAUSE:
// Пользователь приостанавливает или возобновляет оба потока