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();
}
Проблема с потоком - не реагирует на нажатие ESC
Делаю следующее:
1. Создаю форму Form2->ShowModal()
2. В обработчике Form2->OnShow(..) запускаю функцию StartF(...)
3. В функции StartF(...) делаю цикл, т.е. ожидаю от пользователя нажатия клавиши ESC
Код:
Когда у меня StartF(...) является простой функцией, то все ОК - отмена происходит успешно, но когда StartF(...) является потоком, то отмены не происходит, но сообщение о том, что клавиша была нажата приходит...
При создании потока использую критические секции
В чем может быть проблема?
Цитата: frid-karatel
Почему-то поток не реагирует на нажатие клавиши ESC...
Делаю следующее:
1. Создаю форму Form2->ShowModal()
2. В обработчике Form2->OnShow(..) запускаю функцию StartF(...)
3. В функции StartF(...) делаю цикл, т.е. ожидаю от пользователя нажатия клавиши ESC
Когда у меня StartF(...) является простой функцией, то все ОК - отмена происходит успешно, но когда StartF(...) является потоком, то отмены не происходит, но сообщение о том, что клавиша была нажата приходит...
При создании потока использую критические секции
В чем может быть проблема?
Делаю следующее:
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();
}
{
if (Key == VK_ESCAPE) FuncExit = true;
}
//---------------------
void StartF(...)
{
labelExit:
if (!FuncExit)
{
Sleep(100);
goto labelExit;
}
Form2->Close();
}
Когда у меня StartF(...) является простой функцией, то все ОК - отмена происходит успешно, но когда StartF(...) является потоком, то отмены не происходит, но сообщение о том, что клавиша была нажата приходит...
При создании потока использую критические секции
В чем может быть проблема?
В твоей же теме обсуждалось про потоки, даже исходники лежат. Green рассказывал как правильно выходить из потока.
Перечитай еще раз и делай выводы
в том то и дело, что я создаю поток при создании приложения, назначаю ему ID и ставлю в ожидание... потом его активирую (функцией StartF(...)) - и работает в некоторых моментах хорошо, т.е. реагирует н анажатие клавиши, а в том примере, что я привел - нет... может быть цикл забивает доступ к переменной FuncExit? Ведь задержек никаких нет... он просто постоянно проверят эту переменную...
Код:
__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;
}
: 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;
}
Цитата:
а в том примере, что я привел - нет... может быть цикл забивает доступ к переменной FuncExit?
Если судить по тому коду, который ты привёл, то скорее всего пока твой поток работает, форма не подучает оконных сообщений. Попробуй там где ты ожидаешь поток обрабативать сообщения и снова ожидать поток циклично, или вообще не ожидать поток, закроешь его при выходе из программы, а еще лучше зделать синхронизацию той переменной, по которой закрывается форма, а также поставить небольшую задержку в потоке.