Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб-07(Shinhron) Синхронизация потоков.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
327.68 Кб
Скачать

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:

// Пользователь приостанавливает или возобновляет оба потока