Таймер в потоке?
создаю таймер в потоке, но когда тикает и начинает выполняться код, то основное приложение замирает, хотя это и другой поток - в чем глюк?
А как ты его создаешь.. ?
через new...
незнаю что за new такое для создание нового потока поробуй использовать:
_beginthead
TTimerThread *TimerThread = new TTimerThread(false);
ты предлагаешь API юзать? VCL как-то сподручнее... но все равно попробую. ;)
Автор Шамис
Там в одном месте разбирается,
как сделать таймер, в отдельном потоке,
чтобы он хорошо работал.
При желании и книгу, и тексты программ к ней
можно найти в Инете
Если не получится - пиши -помогу
Там все делается, насколько я помню,
без API
да можно и с API - даже эффективнее получится - мне хочется сам принцип понять почему таймер не работает... сам поток работает как надо - параллельно, а вот таймер запускается как будто в главном потоке приложения...
А он скорее всего там и создается :) наскока я помню таймер в винде (тот который WM_TIMER сообщение посылает) привязывается к окну... соответсвенно билдер скорее всего создает его на основе главного окна (или какого-нить временно-созданного) и посылает в тред сообщения....
Хотя могу и все путать... см. исходники VCL
да - наверное так и есть... поглядим.
А ВКЛ разве в исходниках.. ? ? ?
А ВКЛ разве в исходниках.. ? ? ?
смотря какую поставку билдера ставить :)
в энтерпрайзе вроде в исходниках
создаю таймер в потоке, но когда тикает и начинает выполняться код, то основное приложение замирает, хотя это и другой поток - в чем глюк?
Таймер создается для конкретного окна. окно принадлежит потоку.=>
1. Создай окно в новом потоке.
2. Создай таймер
3. Цикл обработки сообщений.
-------------пример------------
DWORD __stdcall TimerThreadProc(void * p)
{
HWND hwnd = ::CreateWindow(...);
::SetTimer(hWnd, 100, NULL);
MSG msg;
while (::GetMessage(&msg, NULL, 0, 0))
::DisptchMessage(&msg)
}
// цикл обработки сообщений нужен обезательно, даже если использовать TimerProc
// и вообще все это-же можно сделать по другому
DWORD __stdcall TimerThreadProc(void * p)
{
while( bContinue )
{
::Sleep(dwDelay);
// .....
// Do anithing
}
}
// P.S Главное забыть за VCL