質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

7836閲覧

PostMessage()関数について

Alyn

総合スコア50

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/06/29 08:07

ソースコードはありませんがArduinoでシリアル送信したデータをMFCアプリで作ったダイアログに表示するプログラムを作っています。
スイッチ入力があった時にArduinoから抵抗値とピン番号がシリアル送信され、どのボタンが押されたかを表示アプリです。
エディットボックスへの引き渡しは非同期にPostMessage()関数を使ってエディットボックスに表示する関数にデータを引き渡しています。

しかしそのPostMessage()関数に問題があります。
Arduinoから信号値を3回異なる連続で送信した場合、PostMessage()関数が3回目のデータが2回目のデータになっていて3回目のデータが引き渡されていませんでした。(1→2→3と引き渡すはずが1→2→2と引き渡されていた)

非同期処理ではないSendMessage()関数にすると上記の不具合は解決しました。

この不具合の原因がわかる方はいますでしょうか?
また非同期処理のままで不具合を直すにはどうしたらいいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2019/06/29 08:52

>ソースコードはありません どうやって不具合を直すのですか? >PostMessage()関数に問題があります Microsoftにbug報告してください。
Alyn

2019/06/29 09:01

ソースコードは持ち出しができないです。 ここで質問します
guest

回答2

0

ベストアンサー

ありがちな例としては

c++

1char data[100]; 2strcpy(data, "data1"); 3PostMessage(hwnd, WM_APP+1, 0, data); 4strcpy(data, "data2"); 5PostMessage(hwnd, WM_APP+1, 0, data);

等として同じメモリを上書きしてしまっている事です。

c++

1char *data; 2 3data = new char[6]; 4strcpy(data, "data1"); 5PostMessage(hwnd, WM_APP+1, 0, data); 6 7data = new char[6]; 8strcpy(data, "data2"); 9PostMessage(hwnd, WM_APP+1, 0, data);

等のように、都度配列を確保しdeleteの責任ごと渡してしまうという手があります。

投稿2019/06/29 08:21

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Alyn

2019/06/29 08:30

その例では後ろのdata2が2回ポストされることにならないのでしょうか?
asm

2019/06/29 10:12

なぜ、そう感じたのかはわかりませんが「ならない」です。
Alyn

2019/06/29 10:26

data1が処理される前にdata2にdataを上書きしたらdata2を2回処理することになりませんか?
asm

2019/06/29 10:29

えぇ、そうですね。最初にあげた例ですとそういう問題があります。 そのために後にあげた例では`new`しなおす事でdataが指す配列を変更しています。
pepperleaf

2019/06/29 11:20

さもなければ、100個位用意して、使いまわすか。
Alyn

2019/07/01 22:49

ダイアログボックスへ引き渡すポインタを独自のものに変更したら解決しました。ありがとうございました
guest

0

非同期にすると、その実行の順番はどうなるかわからなくなります
先に起動したから先に実行されるという保証はありません

#非同期なんだから当然の話しですね

そこらへんに引っかかってるんじゃないかと思われますが、さすがにソースがないと確定的なことは言えませんね

投稿2019/06/29 08:55

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Alyn

2019/06/29 09:06

順番は入れ替わっても問題ありませんが、データが上書きか消失してしまってるんですよね。 メッセージキューのデータを処理前に書き換えることはできるのでしょうか?
y_waiwai

2019/06/29 09:11 編集

そこらへんを真剣にどうにかしたいと思うなら、ソースを出しましょう。 こっちはソースの提示がないため、質問のとおりの「考えられること」を述べてるに過ぎません
Alyn

2019/06/29 09:15

持ち出しができないためソースコードはありません。 「考えられること」で全然構いません。ありがとうございます。
y_waiwai

2019/06/29 09:17

一番可能性が高いのは、コードにバグがあるから。ということになろうかとおもいますが、 さすがにそれを回答に書くのははばかれますね。。 #べつに煽ってるのではないので誤解の無きよう
Alyn

2019/06/29 09:47

PostMessage()関数のwParam,lParamを書き換えてポストしてるのでasmさんがおっしゃられてる通り、同じポインタを使用してることによる可能性があると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問