GUI プログラムを使用せずにコンソールで SetTimer を使用する

UpdateData(true); コントロールの値をメンバー変数に代入します
UpdateData(false); メンバー変数の値をコントロールに割り当てます
UpdateData; 現在のダイアログを更新するために使用されます
つまり、ClassWizard を使用してコントロールと変数の間の接続を確立する場合、変数の値を変更し、ダイアログ ボックス コントロールの表示を更新する場合は、変数を変更した後に UpdateData(FALSE) を呼び出す必要があります。ユーザーがダイアログ ボックスに入力した内容を知りたい場合は、変数にアクセスする前に UpdateData(TRUE) を呼び出す必要があります。

-------------------------------------------------- --------------------------------------

Windows 開発では、シナリオによってはインターフェイスのないプログラムを使用することが避けられません。ただし、一部のタスクを定期的に処理するには、Windows API のタイマー SetTimer を使用する必要があります。


Windows がメッセージ駆動であることは誰もが知っていますが、タイマー SetTimer のタイムアウトもメッセージによって駆動されます。コンソール プロセスのメイン スレッドはメッセージを周期的に配布せず、Windows はタイムアウト コールバック関数を呼び出しません。


この場合、どのように対処すればよいのでしょうか?

現在のスレッドにメッセージ ループを積極的に追加して、現在のスレッドにメッセージを分散し、タイマーが正常に実行できるようにすることができます。

デモではタイマーを作成し、タイムアウト時間を3秒に設定しましたが、タイムアウトコールバック関数では現在時刻を取得して出力するので、実行結果が一目瞭然です。
 

#include <iostream>
#include <windows.h>

VOID CALLBACK TimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTimer)
{
	//获取系统时间
	SYSTEMTIME time;
	GetLocalTime(&time);
	char dateTimeStr[200] = { 0 };
	sprintf_s(dateTimeStr, "%d-%02d-%02d %02d:%02d:%02d", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);

	std::cout << dateTimeStr << std::endl;
}

int main()
{
	UINT_PTR uTimerID = SetTimer(NULL, 0, 1000, TimerProc);// 3000三秒, TimerProc);

	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		DispatchMessage(&msg);
	}

	KillTimer(NULL, uTimerID);

	return 0;
}

おすすめ

転載: blog.csdn.net/aw344/article/details/131746468