問題タブ [labwindows]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
thread-safety - LabWindows/CVI で ThreadSafe 変数マクロを使用する
LabWindows/CVI 環境でスレッド セーフ変数マクロを使用していますが、解放される前にスレッド セーフ変数へのポインターを取得できることがわかりました。(前回のリクエストより)
私が保護しようとしているデータは であるため、struct
ネスト レベルを明示的に設定することはできません。したがって、ネスト レベルは 0 のままであると仮定します。つまり、単一のスレッド セーフ ポインタが発行されると、2 番目のリクエストは拒否されます。第一弾が発売されるまで。ただし、デバッグ セッションをステップ実行しているときに、これが当てはまらないことがわかりました。F8ステップインDefineThreadSafeVar(CLI, SafeCli);
キーを使用し続けることでステートメントの実行が続行され、スレッド セーフ変数へのポインターに対する後続の要求は、元の変数を解放することなく許可されます。
私の予想では、これらのマクロは、スレッドセーフ変数へのポインターが発行され、まだ解放されていない場合、その変数へのアクセスを防止する必要があります。
私の期待は間違っていますか?
または、呼び出しを正しく実装していませんか?
ここに私のソースコードがあります:
c - C - デバッグ モードがコールバック イベントを認識しない
Labwindows/CVI で簡単な UDP 転送プログラムを作成しようとしています。アイデアは、2 つの UDP チャネルを作成し、1 つを使用してデータをポートに書き込み、もう 1 つを使用してデータを受信して出力するというものです。
受信側は次のとおりです。
私の主な問題は、デバッグモードで実行すると、表示されたコールバック関数が呼び出されないことです。つまり、「コールバックが呼び出されました」が出力されず、結果のreadChannel()
呼び出しに保存または出力されたデータは表示されません。
ただし、コンパイルして .exe として実行すると、意図したとおりに動作します。そのポートでデータが受信されるたびに、コールバックが実行されます。
これが発生する原因となるデバッグ バージョンと「リリース」バージョンの違いは何ですか?
getchar()
編集:多くのテストの後、メインスレッドがハングアップする原因となったような関数を使用してメッセージを待機することに関係していると思います。なぜリリースモードで動いたのかはわかりませんが、出力ウィンドウの違い(?)が関係しているのではないでしょうか。私の解決策は、コールバックを削除し、受信チャネルを独自のスレッドで実行することでした。このようにして、スレッドは常にメッセージを待っています。
UDPRead(readerChannel, 0, 0, UDP_WAIT_FOREVER, NULL, NULL)) < 0)
そして、メインスレッドは必要に応じてメッセージを取得できます。誰かが追加情報を持っている場合は、私に知らせてください。
c - アナログ入力からアレイへのボルト DC を測定し、RMS でボルト DC を計算します。
私は GeoTest ATEasy と LabWindows\CVI でテストの自動化を開発しています。テストでは、アナログとデジタルの出力\入力を測定します。
テストの1つでは、オーディオ信号を含むアナログ入力を測定し、そのHzとVolt DC RMSを確認する必要があります。
オーディオ信号はRMSで 5Hz および 2 ボルト DCです。
複数の Volt サンプルを配列に測定する可能性がありますが、何を、何をサンプリングしたいかを決定する必要がありsample rate
ます# of samples
。
測定後、信号がRMSで 5Hz および 2 ボルト DC であることを確認する必要があります。
データを分析して、信号が実際にRMSで 5Hz および 2 ボルト DC であるかどうかを確認する方法について何か提案はありますか?
これらの計算を実行できるアルゴリズムまたはライブラリ関数が必要です。
私のsample rate
と# of samples
(配列のサイズでもある)はどうあるべきですか?
c++ - LabWindows/CVI の dll からエクスポートされた関数を呼び出す
私は C/C++ でのプログラミングが初めてで、Microsoft のヘルプや他の StackOverflow の質問を調べましたが、私の問題に対する答えが見つかりませんでした。
Visual Studio 2008 で作成した DLL からエクスポートされた関数を呼び出そうとしています。この DLL は、VBA マクロおよび LabWindows/CVI で作成されたユーザー インターフェイス プログラムから呼び出されます。VBA マクロでは問題なく動作しますが、読み込もうとすると LabWindows のプログラムがクラッシュします。
静的呼び出しと動的呼び出しの両方を試しました。ここに私が持っているものがあります:
DLL 内の関数は、VBA が使用できるように _stdcall と .def ファイルを削除するために __declspec( dllexport ) という方法でエクスポートされます。
入力文字列は、非常に長い文字配列です。+60 個の文字列 (各文字列はコンマ "," で区切られています) を渡す方法です。次に、コードでは、コンマ (",") を参照として使用して strtok で分割されます。これは、関数内の VBA の入力制限が 60 であるため必要です。
関数を静的に呼び出そうとすると (.lib ファイルと DLL のヘッダーをプロジェクトに追加する)、次のエラーが発生します。
静的呼び出しのコードは次のとおりです。
彼の装飾名で関数を呼び出してみましたが、うまくいきません。
DependencyWalker で関数の名前を確認すると、次の名前が表示されます。
関数の呼び出しと定義でも使用してみましたが、成功しませんでした。
私が間違っていることは何ですか?
関数を動的に呼び出そうとすると、プログラムがクラッシュします。DLL、ヘッダー ファイル、および .lib は、プロジェクト フォルダーに配置されます。
クラッシュしたときにプログラムをデバッグすると、char * のコンマ (",") が '\0' に置き換えられているため、最初の文字列だけが DLL に到達します。それが理由なのかもしれませんが、なぜコンマ (",") が置き換えられているのかわかりません。
また、装飾された名前で呼び出してみましたが、成功しませんでした。
c - 24 ビット符号付きデータ型
ublox GPS モジュールから 24 ビット長のビットフィールド (4 バイト メッセージの 3 バイト) でデータを受信しています。これらの 24 ビット データ フィールドを符号付き 10 進数値に変換する必要がありますが、方法の説明が見つかりません。仕様でこれを行います。また、モジュールに付属している別のプログラムから特定の値を知っています。
正の値の場合、単に 24 ビットの 2 進数を 10 進数に変換するだけのように見えます。たとえば0x000C19 = 3097
and0x000BD0 = 3024
ですが、負の数の場合は困っています。2 の補数は機能しないようです。0xFFFFC8 = -57
、0xFCB9FE = -214528
、0xFF2C3B = -54215
およびの既知の値を次に示します0xFFFA48 = -1462
。2 の補数を使用すると、変換は毎回数個ずつずれます (それぞれ -56、-214530、-54213、-1464)。(16 進数は、毎回 24 桁を書き込まなくても済むようにするために使用されます。)
事前にご協力いただきありがとうございます。