Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с потоком - не реагирует на нажатие ESC

490
13 марта 2008 года
frid-karatel
357 / / 15.09.2007
Почему-то поток не реагирует на нажатие клавиши ESC...
Делаю следующее:
1. Создаю форму Form2->ShowModal()
2. В обработчике Form2->OnShow(..) запускаю функцию StartF(...)
3. В функции StartF(...) делаю цикл, т.е. ожидаю от пользователя нажатия клавиши ESC

Код:
void __fastcall TForm2::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
  if (Key == VK_ESCAPE) FuncExit = true;
}
//---------------------
void StartF(...)
{
labelExit:
  if (!FuncExit)
  {
    Sleep(100);
    goto labelExit;
  }
  Form2->Close();
}


Когда у меня StartF(...) является простой функцией, то все ОК - отмена происходит успешно, но когда StartF(...) является потоком, то отмены не происходит, но сообщение о том, что клавиша была нажата приходит...

При создании потока использую критические секции

В чем может быть проблема?
11
13 марта 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: frid-karatel
Почему-то поток не реагирует на нажатие клавиши ESC...
Делаю следующее:
1. Создаю форму Form2->ShowModal()
2. В обработчике Form2->OnShow(..) запускаю функцию StartF(...)
3. В функции StartF(...) делаю цикл, т.е. ожидаю от пользователя нажатия клавиши ESC

Код:
void __fastcall TForm2::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
  if (Key == VK_ESCAPE) FuncExit = true;
}
//---------------------
void StartF(...)
{
labelExit:
  if (!FuncExit)
  {
    Sleep(100);
    goto labelExit;
  }
  Form2->Close();
}


Когда у меня StartF(...) является простой функцией, то все ОК - отмена происходит успешно, но когда StartF(...) является потоком, то отмены не происходит, но сообщение о том, что клавиша была нажата приходит...

При создании потока использую критические секции

В чем может быть проблема?



В твоей же теме обсуждалось про потоки, даже исходники лежат. Green рассказывал как правильно выходить из потока.
Перечитай еще раз и делай выводы

490
13 марта 2008 года
frid-karatel
357 / / 15.09.2007
в том то и дело, что я создаю поток при создании приложения, назначаю ему ID и ставлю в ожидание... потом его активирую (функцией StartF(...)) - и работает в некоторых моментах хорошо, т.е. реагирует н анажатие клавиши, а в том примере, что я привел - нет... может быть цикл забивает доступ к переменной FuncExit? Ведь задержек никаких нет... он просто постоянно проверят эту переменную...
11
13 марта 2008 года
oxotnik333
2.9K / / 03.08.2007
Код:
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  Terminate = false;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 CreateThread( NULL , 0 , ChangeForm2, (LPVOID)this, 0 , NULL );
 Application->OnMessage = AppMess;
}
//---------------------------------------------------------------------------
DWORD WINAPI ChangeForm2 (LPVOID pForm)
{
  TForm1 *fm = (TForm1*) pForm;
  for (int i=0; i<100; i++)
      {
        fm->ProgressBar1->Position++;
        Sleep(150);
        if (Form1->Terminate) return 0;
      }
  return 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AppMess(tagMSG &Msg, bool &Handled)
{
  if (Msg.message == WM_KEYDOWN)
     if (Msg.wParam == VK_ESCAPE)
        Terminate = true;
     else Terminate = false;
}
9.3K
13 марта 2008 года
iridum
175 / / 26.08.2007
Цитата:

а в том примере, что я привел - нет... может быть цикл забивает доступ к переменной FuncExit?



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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог