Re: SetConsoleCtrlHandler и многопоточность
От: Аноним  
Дата: 18.09.09 09:33
Оценка:
Здравствуйте, mityaj.it.0, Вы писали:

MI0>Привет всем, есть такой код:

MI0>
MI0>BOOL ConsoleHandler( DWORD fdwCtrlType )
MI0>{
MI0>    switch (fdwCtrlType) {
MI0>        case CTRL_C_EVENT: {
MI0>            std::cout << "Exit." << "\n";
MI0>                        exit(1);
MI0>        }

MI0>    }
MI0>}
MI0>int _tmain(int argc, _TCHAR* argv[])
MI0>    if (SetConsoleCtrlHandler( (PHANDLER_ROUTINE)ConsoleHandler,TRUE)==FALSE) {
MI0>        // unable to install handler... 
MI0>        return -1;
MI0>    }
MI0>    try {
MI0>        // Enable exceptions in cin.
MI0>        std::cin.exceptions(std::ios::badbit|std::ios::failbit);
MI0>        int itSum = 0;
MI0>        std::cin >> itSum;
MI0>    catch (...) {
MI0>        std::cout << "Error!" << "\n";
MI0>    }
MI0>}

MI0>

MI0>Необходимо при ожидании ввода числа иметь возможность завершить программу по нажатию [Ctrl+C]. Данный код
MI0>это предоставляет, но с одним "НО": обработчик ConsoleHandler вызывается в другом потоке и основной поток также продолжает выполнение.
MI0>В итоге выполняется обработчик исключения и обработчик [Ctrl+C]. Это некорректно. Каким образом затормозить основной поток или
MI0>дать ему понять, что нажата [Ctrl+C]?

Используйте средства синхронизации, можно посмотреть здесь — http://msdn.microsoft.com/ru-ru/library/172d2hhw.aspx
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.