Discussion:
関数の呼出しについて
(too old to reply)
unknown
2007-09-27 09:01:01 UTC
Permalink
環境:VC++2005
Windowsアプリケーションですが、simulatorDlg.cppの中でグローバル関数「NINT spthread(
)」を作って、中でWindowsのListBoxに一行の文字列を追加するというローカル関数「simulatorDlg::disp_msg(
)」を呼出しています。呼出し自体はエラーが出なかったが、ListBoxに文字列が追加されていません。そのローカル関数の中にBreakPointを設定してみたら、全く入って来ないので、ローカル関数が呼出されていないことが分かりました。

呼出しのやり方は(以下はローカル関数の一部)
simulatorDlg dlg


dlg.disp_msg( );


どうして呼出されなかったのでしょうか。
ちゅ
2007-09-27 09:35:52 UTC
Permalink
$B$A$e(B $B$G$9!#(B

On Thu, 27 Sep 2007 02:01:01 -0700
$B4X?t$N8F=P$7$K$D$$$F(B
$B$I$&$7$F8F=P$5$l$J$+$C$?$N$G$7$g$&$+!#(B
$BDs<($5$l$F$$$k>pJs$,>/$J$$$N$G?dB,$G$9$,!"(B
$B%@%$%"%m%0$***@8@.$7$FI=<($5$l(B ListBox $B$KJ8;zNs$rDI2C$9$k$^$G$N(B
$B%$%Y%s%H%O%s%I%iFb$K(B dlg.disp_msg( ) $B$,L5$$$+$i$G$7$g$&!#(B

$B$I$N%?%$%_%s%0$G8F$S=P$7$r9T$C$F$$$^$9$+!)(B
$B<+J,$,8F$S=P$7$?$$2U=j$G$N%$%Y%s%H$rD4$Y$F8F$S=P$7$F2<$5$$!#(B

--
$B$A$e(B
$B4D6-!'(BVC++2005
Windows$B%"%W%j%1!<%7%g%s$G$9$,!"(BsimulatorDlg.cpp$B$NCf$G%0%m!<%P%k4X?t!V(BNINT spthread(
)$B!W$r:n$C$F!"Cf$G(BWindows$B$N(BListBox$B$K0l9T$NJ8;zNs$rDI2C$9$k$H$$$&%m!<%+%k4X?t!V(BsimulatorDlg::disp_msg(
$B8F=P$7$N$d$jJ}$O!J0J2<$O%m!<%+%k4X?t$N0lIt!K(B
simulatorDlg dlg
$B!D(B
dlg.disp_msg( );
$B!D(B
$B$I$&$7$F8F=P$5$l$J$+$C$?$N$G$7$g$&$+!#(B
unknown
2007-09-28 02:25:01 UTC
Permalink
ご解答有難う御座います。

情報不足ですみませんが、補足します。
ずっとVBを使っていましたが、VC++をやり始めたばっかりです。実はVC++でRS232通信のシミュレーションを作っているところです、やりたいこととしては、通信相手との一連通信のやり取りをシナリオで設定して、それに従って行います。画面で「シナリオ開始」ボタンを押したら、シナリオを走らせ、何分間もありえますので、もう一個の「シナリオ停止」ボタンを設けて、押したら停止させます。

やり方としては、
①RS232リスナーとシナリオエンジンという2つのスレッドを、OnInitDialogの中で作成します。
②シナリオエンジンというワーカ関すで、停止フラグが立たない限り無限ループでシナリオを実行しています、RS232から通信相手からの通信が来ない間は待つ状態です。シナリオ完了或いは停止ボタンを押したら、グローバル変数の停止フラグが立ち、無限ループから脱却、ワーカ関数が終了します。
③ワーカ関数の中では、受信データのチェックから、送信データの作成や送信などの処理は、同じcppの中で用意されたクラスの関数を呼出して、実現したいです。

実行してみた結果は、前述の通りで、ワーカ関数の中での呼出しが実に実行されていなかったのです。

このようなやり方自体はまずいでしょうか。
ちゅ です。
On Thu, 27 Sep 2007 02:01:01 -0700
関数の呼出しについて
どうして呼出されなかったのでしょうか。
提示されている情報が少ないので推測ですが、
ダイアログを生成して表示され ListBox に文字列を追加するまでの
イベントハンドラ内に dlg.disp_msg( ) が無いからでしょう。
どのタイミングで呼び出しを行っていますか?
自分が呼び出したい箇所でのイベントを調べて呼び出して下さい。
--
ちゅ
環境:VC++2005
Windowsアプリケーションですが、simulatorDlg.cppの中でグローバル関数「NINT spthread(
)」を作って、中でWindowsのListBoxに一行の文字列を追加するというローカル関数「simulatorDlg::disp_msg(
)」を呼出しています。呼出し自体はエラーが出なかったが、ListBoxに文字列が追加されていません。そのローカル関数の中にBreakPointを設定してみたら、全く入って来ないので、ローカル関数が呼出されていないことが分かりました。
呼出しのやり方は(以下はローカル関数の一部)
simulatorDlg dlg

dlg.disp_msg( );

どうして呼出されなかったのでしょうか。
UETA, Shin-ichi
2007-09-28 04:08:48 UTC
Permalink
こんにちは、植田です。
Post by unknown
①RS232リスナーとシナリオエンジンという2つのスレッドを、
OnInitDialogの中で作成します。
おそらくMFCをお使いだと思いますが、MFCでマルチスレッドを
扱う場合、ウィンドウハンドルとCWndオブジェクトのマッピング
が問題になります。

詳しくはこれ↓をご覧あれ。

Visual C++
マルチスレッド : プログラミングのヒント
http://msdn2.microsoft.com/ja-jp/library/h14y172e(VS.80).aspx
--
植田システム設計事務所
Ueta System Design Studio
http://www.usdesign.jp/
植田真一
mailto:***@usdesign.jp
ちゅ
2007-09-28 04:18:02 UTC
Permalink
$B$A$e(B $B$G$9!#(B

On Thu, 27 Sep 2007 19:25:01 -0700
Re: $B4X?t$N8F=P$7$K$D$$$F(B
$B$3$N$h$&$J$d$jJ}<+BN$O$^$:$$$G$7$g$&$+!#(B
$BA02s$b=q$-$^$7$?$,!"(B
$B<+J,$,8F$S=P$7$?$$2U=j$G$N%$%Y%s%H$rD4$Y$F8F$S=P$7$F2<$5$$!#(B

$B$^$:!"(BListBox$B$K0l9T$NJ8;zNs$rDI2C$9$k;v$H$O2?$r$7$?$$$N$G$9$+!)(B

APP$BB&!"%@%$%"%m%0!"#2$D$N%9%l%C%I$NIW!9$N>uBVA+0\?^$r=q$1$P$4<+J,$N(B
$B%m%8%C%/$,@5$7$$$+J,$+$k$H;W$$$^$9!#(B
$B>uBVA+0\?^$K4p$$$F%U%m!<%A%c!<%H$r=q$/$H2?=h$GL\E*$N4X?t$r8F$S=P$;$P(B
$BNI$$$+J,$+$kH&$G$9!#(B

disp_msg() $B4X?t$=$N$b$N$,8F$S=P$5$l$J$$$N$i!"$=$N4X?t$r8F$S=P$7$F$$$k(B
$B4X?t$,$I$3$i$+8F$S=P$5$l$k$Y$-4X?t$J$N$+$r9M$($F8+$F$/$@$5$$!#(B

$B0x$_$K(B SDK $B$J$N$+(B MFC $B$J$N$+$OJ,$+$j$^$;$s$,!"%9%l%C%I$r8Y$$$G%a%C%;!<%8$r(B
$BEAGE$5$;$k$K$O(B PostThreadMessage() API $B$r;HMQ$7$^$9!#(B

--
$B$A$e(B
$B$42rEzM-Fq$&8f:B$$$^$9!#(B
$B>pJsITB-$G$9$_$^$;$s$,!"JdB-$7$^$9!#(B
$B$d$jJ}$H$7$F$O!"(B
$B-"%7%J%j%*%(%s%8%s$H$$$&%o!<%+4X$9$G!"Dd;_%U%i%0$,N)$?$J$$8B$jL58B%k!<%W$G%7%J%j%*$r<B9T$7$F$$$^$9!"(BRS232$B$+$iDL?.Aj<j$+$i$NDL?.$,Mh$J$$4V$OBT$D>uBV$G$9!#%7%J%j%*40N;0?$$$ODd;_%\%?%s$r2!$7$?$i!"%0%m!<%P%kJQ?t$NDd;_%U%i%0$,N)$A!"L58B%k!<%W$+$iC&5Q!"%o!<%+4X?t$,=*N;$7$^$9!#(B
$B<B9T$7$F$_$?7k2L$O!"A0=R$NDL$j$G!"%o!<%+4X?t$NCf$G$N8F=P$7$,<B$K<B9T$5$l$F$$$J$+$C$?$N$G$9!#(B
$B$3$N$h$&$J$d$jJ}<+BN$O$^$:$$$G$7$g$&$+!#(B
unknown
2007-09-28 07:00:01 UTC
Permalink
ご解答有難う御座います。

やり方をもう一度整理して見ます。
ちゅ です。
On Thu, 27 Sep 2007 19:25:01 -0700
Re: 関数の呼出しについて
このようなやり方自体はまずいでしょうか。
前回も書きましたが、
自分が呼び出したい箇所でのイベントを調べて呼び出して下さい。
まず、ListBoxに一行の文字列を追加する事とは何をしたいのですか?
APP側、ダイアログ、2つのスレッドの夫々の状態遷移図を書けばご自分の
ロジックが正しいか分かると思います。
状態遷移図に基いてフローチャートを書くと何処で目的の関数を呼び出せば
良いか分かる筈です。
disp_msg() 関数そのものが呼び出されないのら、その関数を呼び出している
関数がどこらか呼び出されるべき関数なのかを考えて見てください。
因みに SDK なのか MFC なのかは分かりませんが、スレッドを跨いでメッセージを
伝播させるには PostThreadMessage() API を使用します。
--
ちゅ
ご解答有難う御座います。
情報不足ですみませんが、補足します。
ずっとVBを使っていましたが、VC++をやり始めたばっかりです。実はVC++でRS232通信のシミュレーションを作っているところです、やりたいこととしては、通信相手との一連通信のやり取りをシナリオで設定して、それに従って行います。画面で「シナリオ開始」ボタンを押したら、シナリオを走らせ、何分間もありえますので、もう一個の「シナリオ停止」ボタンを設けて、押したら停止させます。
やり方としては、
①RS232リスナーとシナリオエンジンという2つのスレッドを、OnInitDialogの中で作成します。
②シナリオエンジンというワーカ関すで、停止フラグが立たない限り無限ループでシナリオを実行しています、RS232から通信相手からの通信が来ない間は待つ状態です。シナリオ完了或いは停止ボタンを押したら、グローバル変数の停止フラグが立ち、無限ループから脱却、ワーカ関数が終了します。
③ワーカ関数の中では、受信データのチェックから、送信データの作成や送信などの処理は、同じcppの中で用意されたクラスの関数を呼出して、実現したいです。
実行してみた結果は、前述の通りで、ワーカ関数の中での呼出しが実に実行されていなかったのです。
このようなやり方自体はまずいでしょうか。
Continue reading on narkive:
Loading...