Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Обработка прерываний


Автор: Aline 21.2.2008, 16:53
Привет всем!
Делаю проект, в котором необходимо в отдельном потоке отловить событие(прерывание) и послать сообщение.
В отдельности с каждой проблемой вроде бы разобралась: как создать поток, как ожидать событие, как послать сообщение. А вот всё вместе работать не хочет...

Вот частичный код:

Код

hEvent = OpenEvent(SYNCHRONIZE, false, (LPCWSTR)"IRK_Event");

RecThread = gcnew Thread(gcnew ThreadStart(&ThreadProc));


далее...
Код

static void ThreadProc()
           {            
        
               if (WaitForSingleObject(hEvent, 500) != WAIT_TIMEOUT) {
                   PostMessage(Form1::hForm,WM_USER,0,0);               
               }         
           }


по событию, обрабатываем:

Код

 [SecurityPermission(SecurityAction::Demand, Flags=SecurityPermissionFlag::UnmanagedCode)]
          virtual void WndProc( Message% m ) override
          {
             
             // Listen for operating system messages.
             switch ( m.Msg )
             {
                case WM_USER:          
                   StartRecRead();                   
                   break;           
             }
             Form::WndProc( m );
          }



но проблема в том, что когда прерывания идут подряд, буквально разница в считанные миллисекунды, они теряются...

Что здесь можно сделать?

Автор: marcusmae 22.2.2008, 15:49
Aline,  первый фрагмент кода, видимо, находится в рутине StartRecRead()? То есть, приходит первое сообщение WM_USER - вы по нему создаёте поток, который ждёт, когда возникнет другое событие "IRK_Event", и как только оно возникает, отправляет очередное событие WM_USER, которое создаёт новый поток и т.д. Так? Ну, подозрительного вроде ничего нет, было бы по-больше коду - можно было бы потестить...

Автор: Aline 26.2.2008, 08:36
marcusmae, нет, первый фрагмент - на кнопке. Т.е. жмешь на кнопку, запускаешь поток, как только произошло событие в StartRecRead происходит считывание данных с платы. Проблема в том, что началось считывание, а в это время могло произойти ещё одно событие и почему то оно пропадает....
Была мысль, что нужно создать очередь сообщений, но как то у нас не получилось сочередью...

Автор: marcusmae 26.2.2008, 09:57
Цитата(Aline @  26.2.2008,  08:36 Найти цитируемый пост)
Проблема в том, что началось считывание, а в это время могло произойти ещё одно событие и почему то оно пропадает....


Ну тогда по-моему совершенно понятно, почему оно пропадает : кнопка включает слушателя WaitForSingleObject в отдельном потоке. Как только событие произошло, ожидание событий закончилось - всё, что пришло после, никому не нужно. Правильно?

В принципе, роль потока, как я понимаю, незначительна. Раз Вы коду полноценного не даёте, то можно временно переткнуть цикл ожидания в основной поток и походить там отладчиком, чтобы понять что происходит.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)