Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / WaitableTimer не вызывает функцию / 7 сообщений из 7, страница 1 из 1
06.07.2018, 18:02
    #39670838
хорошо я согласен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WaitableTimer не вызывает функцию
Простой код:
Код: 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
06.07.2018, 18:35
    #39670850
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WaitableTimer не вызывает функцию
хорошо я согласенруководствовался 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
06.07.2018, 19:09
    #39670859
хорошо я согласен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WaitableTimer не вызывает функцию
что в данном контексте означает "calls the completion routine"?

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

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

У тебя же после вызова SetWaitableTimer сразу идет завершение ф-ции - такой код работать не будет
...
Рейтинг: 0 / 0
06.07.2018, 20:30
    #39670883
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WaitableTimer не вызывает функцию
хорошо я согласенПри этом в 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
06.07.2018, 21:02
    #39670895
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WaitableTimer не вызывает функцию
Cerebrumили юзать лямду

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


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