Re[11]: SetConsoleCtrlHandler и многопоточность
От: Сергей Мухин Россия  
Дата: 21.09.09 09:02
Оценка:
Здравствуйте, Аноним, Вы писали:


СМ>>>>2. это плохая программа, если надо так делать, как все известно, комментарии ее на спасут

А>>>Могут спасти... если все такие места будут помечены хотя бы чем-то вроде '// review' то как минимум их можно очень просто идентифицировать и потом предпринять какие-либо действия по исправлению.

СМ>>если все места будут помечены — идеализм.

А>Стремиться к идеалу и выполнять действия, способствующие в его достижении — это плохо? Такие комментарии реально помогают.

??? реально помочь — это исправить. Комментари этого сделать не могут по определению.
Они могут обозначить проблемную точку, но и только, Это создает ложное заключение, что мы знаем сложные места. А ломается обычно не там


По Вашему получается — если программа содержит такой комментарий, то она плохая, комментарии ей не помогут... Такой комменатрий торчит как маяк и говорит "поправь меня". Как по мне, так польза налицо. Иначе можно просто _удалить_ (или не добавлять вообще) этот комментарий — от этого по Вашему программа становится хорошей, хотя "запашок" от такого удаления не исчезает.

я никогда не говорил, что если есть комментарии, то программа плохая! "Хорошесть" определяется только кодом.
---
С уважением,
Сергей Мухин
Re: SetConsoleCtrlHandler и многопоточность
От: gear nuke  
Дата: 21.09.09 16:17
Оценка:
Здравствуйте, mityaj.it.0, Вы писали:

MI0>Каким образом затормозить основной поток или

MI0>дать ему понять, что нажата [Ctrl+C]?

Если рабочий тред всего один, возможно так:
bool ctrl_c = false;

BOOL ConsoleHandler( DWORD fdwCtrlType )
{
    switch (fdwCtrlType) {
        case CTRL_C_EVENT: {
            ctrl_c = true;
            std::cout << "Exit." << "\n";
            exit(1);
        }
    }
}
int main(){

    // Гарантируем выполнение только одного треда в единицу времени
    SetProcessAffinityMask(GetCurrentProcess(), 1);
    
    if (SetConsoleCtrlHandler( (PHANDLER_ROUTINE)ConsoleHandler,TRUE)==FALSE) {
        // unable to install handler... 
        return -1;
    }
    try {
        // Enable exceptions in cin.
        std::cin.exceptions(std::ios::failbit);
        int itSum = 0;
        std::cin >> itSum;
    }
    catch (...) {
    
        // Принудительно выполняем тред с ConsoleHandler
        SwitchToThread();
        
        if ( ! ctrl_c ) 
          std::cout << "Error!" << "\n";
    }

}

Можно еще попробовать GetKeyState(VK_CONTROL);
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.