3

私は C++ を初めて使用し、デバイスにアクセスして特定のデータを収集し、それをローカル ネットワーク上のデータストリームに転送する必要があるプロジェクトを最近開始しました。

私のアプリケーションは必要なすべてのことを行いますが、機能が不足しています。アプリケーションが実行されているウィンドウを閉じても、ハードウェアデバイスは停止しません。その結果、プログラムを終了するたびにハードウェアをリセットする必要があります。これは不便であるだけでなく、プログラムの意図した使用法には不可能です。

私は基本的に、プログラムが閉じられたときに(xをクリックするか、Alt-F4を押すなどして)実行される関数のコールバックを設定したいだけです.

これは可能ですか?このようなイベントのハンドラーを作成する可能性があります。

BOOL WINAPI ConsoleHandler(DWORD dwCtrlEvent)
{
    switch (dwCtrlEvent)
    {
    case CTRL_CLOSE_EVENT:
        // something
    case CTRL_SHUTDOWN_EVENT:
        // the same?
    default:
        return FALSE;
    }
}

これが正しいアプローチである場合、このハンドラーの使用方法を知りたいですか? プログラムでそのようなハンドラーを作成する必要がありますか?更新は常に行われますか?

ジョナスの助けに感謝します

4

4 に答える 4

1

プログラムが正常に終了したときに呼び出されるコールバックを登録できる標準ライブラリ関数atexitがあります。

異常終了を処理するために、例外ハンドラを使用できます。ほとんどの単純なプログラムでは、catch{} の中または後に処理コードを持つ単純な try{}/catch{} ブロックで十分です。高度な設定については、こちらの構造化例外処理を参照してください。

于 2014-08-04T23:04:29.193 に答える
0

プロジェクトをハードウェア ドライバーに分割して、ハードウェアを正常な状態に保ち、ユーザー インターフェイスにデータを表示するようにします。

このように、ユーザー インターフェイスが閉じられても、ドライバーは実行を継続し、クリーンアップしてから終了します。これは、システムのシャットダウン時やタスク マネージャーの使用時など、UI が強制的に閉じられた場合にも機能します。

詳細については、 UMDFを調べることをお勧めします。

于 2014-08-04T15:56:26.930 に答える
0

さまざまなシャットダウン イベント用の特別なハンドラーを配置することもできますが、RAII (リソースの取得は初期化です) と呼ばれるものを使用して、よりオブジェクト指向の方法でリソース制御を設計することを検討する必要があります。この設計パターンには、作成によって基になるデバイスが初期化され、デストラクタによって基になるデバイスが閉じられてクリーンアップされるクラスが含まれます。したがって、このクラスの所有者がどのように破棄されても、デバイスは閉じられます。

于 2014-08-04T15:54:53.230 に答える