powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / WaitableTimer не вызывает функцию
7 сообщений из 7, страница 1 из 1
WaitableTimer не вызывает функцию
    #39670838
хорошо я согласен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void MyData::SuspenseLoading(short* rule, float performance)
{
	LARGE_INTEGER liDueTime;
	liDueTime.QuadPart=0;
	hTimer=CreateWaitableTimer(NULL, FALSE, NULL);
	SetWaitableTimer(hTimer, &liDueTime, 5000, TimerFunction, reinterpret_cast<LPVOID>(this), 0);
}


Сама CALLBACK функция:
Код: plaintext
1.
2.
3.
4.
5.
void CALLBACK TimerFunction(LPVOID lpArg, DWORD dwTimerLowValue, DWORD dwTimerHighValue)
{
	mydata* d = reinterpret_cast<mydata*>(lpArg);
	d->Conitnue();
}


руководствовался MSDN и форумами, но не вышло.
Почему не выполняется функция TimerFunction?
...
Рейтинг: 0 / 0
WaitableTimer не вызывает функцию
    #39670850
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо я согласенруководствовался MSDN и форумами

"Руководствовался" это тупо копи-пастил код?..
MSDNWhen the specified due time arrives, the timer becomes inactive and the APC is
queued to the thread that set the timer. The state of the timer is set to signaled, the
timer is reactivated using the specified period, and the thread that set the timer
calls the completion routine when it enters an alertable wait state
. For more
information, see QueueUserAPC.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
WaitableTimer не вызывает функцию
    #39670859
хорошо я согласен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что в данном контексте означает "calls the completion routine"?

Да, я копи-пастил код и читал документацию, по возможности в неё вникая. До этого всё время работал с SetTimer, но в данный момент он оказался слишком неудобным из-за привязки к окну.
При этом в CALLBACK функцию невозможно передать параметр, откуда конкретно была вызвана эта CALLBACK функция.
...
Рейтинг: 0 / 0
WaitableTimer не вызывает функцию
    #39670863
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо я согласенчто в данном контексте означает "calls the completion routine"?

Дословно: вызвать твою функцию. Читай справку целиком.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
WaitableTimer не вызывает функцию
    #39670880
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо я согласенПочему не выполняется функция TimerFunction?
потому что ф-цию SetWaitableTimer обычно вызывают в отдельном потоке, который находится после ее вызова в alertable wait state , т.е. остановлен функциями из Ex-семейства.

У тебя же после вызова SetWaitableTimer сразу идет завершение ф-ции - такой код работать не будет
...
Рейтинг: 0 / 0
WaitableTimer не вызывает функцию
    #39670883
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо я согласенПри этом в CALLBACK функцию невозможно передать параметр, откуда конкретно была вызвана эта CALLBACK функция.
кто мешает определить и передавать в CALLBACK структуру содержащую указатель на класс (this), например, источник вызова. Саму CALLBACK функцию сделать статической функцией этого класса или юзать лямду

как-то так... (в коде есть утечки - исправишь их сам)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
typedef struct _TIMERTHREADROUTINEINFO
{
	class TimerThread*	pThis;
	DWORD		exit_code;
} TIMERTHREADROUTINEINFO, *LPTIMERTHREADROUTINEINFO;

class TimerThread
{
public:
	TimerThread(void);
	virtual ~TimerThread(void);

protected:
	HANDLE	m_hWaitableTimer;
	HANDLE	m_hTimerThread;
	LPVOID	m_pvContext;
	LONG	m_nRepeatRate;

private:
	DWORD	OnTimerThreadRoutine(void);

protected:
	virtual DWORD TimerThreadRoutine(void);

public:
	BOOL Create(LPVOID pvContext = nullptr);

}; 



TimerThread::TimerThread(void)
{
	m_hWaitableTimer		= NULL;
	m_hTimerThread		= NULL;
}

TimerThread::~TimerThread(void)
{
}

BOOL TimerThread::Create(LPVOID pvContext)
{
	m_hWaitableTimer = ::CreateWaitableTimer(NULL, FALSE, NULL);
	if (m_hWaitableTimer == NULL)
		return FALSE;

	auto lamRoutine = [](LPVOID pvContext)->UINT
			{
				TimerThread* pThis = static_cast<TimerThread*>(pvContext);
				return pThis->TimerThreadRoutine();
			};

	m_hTimerThread = reinterpret_cast<HANDLE>(::_beginthreadex(NULL, 0U, lamRoutine, this, 0UL, nullptr));
	return (m_hTimerThread != NULL);
}

DWORD TimerThread::TimerThreadRoutine(void)
{
	LPTIMERTHREADROUTINEINFO ptrTTRI = new TIMERTHREADROUTINEINFO;
	ptrTTRI->exit_code	= ERROR_SUCCESS;
	ptrTTRI->pThis		= this;

	auto lamRoutine = [](LPVOID pvContext, DWORD, DWORD)
				{
					LPTIMERTHREADROUTINEINFO pTTRI = static_cast<LPTIMERTHREADROUTINEINFO>(pvContext);
					pTTRI->exit_code = pTTRI->pThis->TimerThreadRoutineImpl();
				};

	if (::SetWaitableTimer(m_hWaitableTimer, &m_lnStartTime, m_nRepeatRate, lamRoutine, ptrTTRI, TRUE) == FALSE)
		return ::GetLastError();
	
	while (::WaitForSingleObjectEx(m_hTimerThread, INFINITE, TRUE) == STATUS_USER_APC && m_nRepeatRate) {}
	return ptrTTRI->exit_code;
}

DWORD TimerThread::OnTimerThreadRoutine(void)
{
	return ERROR_SUCCESS;
}
...
Рейтинг: 0 / 0
WaitableTimer не вызывает функцию
    #39670895
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumили юзать лямду

Осталась мелочь: суметь объявить лямбду как stdcall.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / WaitableTimer не вызывает функцию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]