• 締切済み
  • 困ってます

Visual c++でダイアログと処理の切り離し

初心者ですので簡単なものですが質問させてください。 Visual c++2005のMFCのダイアログベースで作られたタイマーで周期処理されるプロジェクトがあります。 ダイアログと処理を別々のプロジェクトに切り離してUDPで通信したいと考えています。 まずは簡単なモノで試したいのですが、どうすればよいのかわからないのでご教授いただけたらと思います。 例えば、処理としてはテキストボックスに数字を入力しボタンを押したら計算結果が表示される簡単なものです。 まずは、これが動作するモノを作りました。 そして同じものをコピペしてソケットを利用してプロジェクト間で通信を行えばよいと考えています。 内部処理としては下記のようになると思うのですが、、、 1.入力した変数をまとめてパケットに変換(ダイアログ側) 2.パケットを送信(ダイアログ側) 3.パケットを受信(処理側) 4.受信したパケットを解釈(処理側) 5.解釈したデータを計算処理(処理側) 6.計算処理結果をパケットに変換(処理側) 7.パケットを送信(処理側) 8.パケットを受信(ダイアログ側) 9.受信したパケットを解釈(ダイアログ側) 10.解釈したデータをダイアログに表示(ダイアログ側) ※通信ではafxsock.hを利用すればよいとのことでした。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数315
  • ありがとう数0

みんなの回答

  • 回答No.2
  • zwi
  • ベストアンサー率56% (730/1282)

トリガとしてはダイアログ側が処理側にコネクトすることになるので、サーバー・クライアント型だと思います。まぁ、そんな区別はどうでもよいのですが、両方がIPアドレスを把握する必要があるので面倒なのです。片一方で済ませたいですよね?って事です。接続されたほうは相手のIPアドレスを知ることができるので返答できる仕組みにした方が良くないでしょうかぐらいの話です。 ロスト覚悟みたいですが、入力データは送れたけど計算結果が返っこないとかありますが良いのでしょうか? あるいは送ったつもりだったが実は届いていないとか。それを知る術がないのがUDPの特徴なのです。 普通は音声データとか部分的に欠けても補正できるデータとかに使います。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • Modalダイアログを他のThreadから閉じたい

    VC++6.0のMFCプロジェクトで、Modalダイアログを他のThreadから閉じる処理を行いたいと考えています。 以下のようなことを実行しているのですが、3.で"MyDialog"にメッセージが送信されません。 1.あるFormView上で、他のスレッド("WorkerThread"とします)を起動する。 2.上記FormView上で、Modalダイアログ("DialogTest"とします)を開く。 3."WorkerThread"にて、一定の処理後にSendMessageを実行して、"MyDialog"にメッセージを送り、EndDialog()を実行させる。 /*----- WorkerThread関数内-----*/ //"TestDialog"のハンドルを取得する。 HWND hWnd = ::FindWindowEx(NULL, NULL, _T("#32770"), NULL); if (hWnd) { CWnd* pWnd = FromHandle(hWnd); if (pWnd) { //処理がここに入っていることは確認できます。 pWnd->SendMessage(WM_MESSAGE_CLOSEDIALOG, 0, 0); } } /*-----定義用ヘッダーファイル------*/ const UINT WM_MESSAGE_CLOSEDIALOG =::RegisterWindowMessage(_T("UWM_MESSAGE_CLOSEDIALOG")); /*-----DialogTest.h------*/ //{{AFX_MSG(CWaitingSearchDialog) //}}AFX_MSG afx_msg void OnCloseDialog(WPARAM wParam,LPARAM lParam); DECLARE_MESSAGE_MAP() /*-----DialogTest.cpp------*/ void DialogTest::OnCloseDialog() { EndDialog(IDOK); } BEGIN_MESSAGE_MAP(DialogTest, CDialog) //{{AFX_MSG_MAP(DialogTest) //}}AFX_MSG_MAP ON_REGISTERED_MESSAGE(WM_MESSAGE_CLOSEDIALOG, OnCloseDialog) END_MESSAGE_MAP() 間違いありましたら、ご指摘いただけないでしょうか。よろしくお願いいたします。 (ところで、私が同カテゴリに先日投稿した「"複数プロジェクトをビルドしたとき、DLLに新しく追加したClassのみがリンクエラーになる "」は、自己解決できました。 もしどなたか適当な回答を投稿してもらえれば、その旨を書けます。お暇な方、お願いできないでしょうか)

  • 実時間処理ってなんですか?

    実時間処理の意味を教えてください。 自分の解釈では、コンピュータにデータを入力した瞬間に データの処理と計算がほぼ同時に進行すること、、、という ふうに思っていますが、曖昧でよくわかりません。 つまり、計算するまえになんらかのデータの生成という 過程があるということでしょうか? よろしくお願いします。

  • 受信処理の終了条件

    TCP通信でデータを送受信してスループットを測定するプログラムを作成しました。 1.ホストAがデータを送信し,ホストBがそれを受信し、スループットを計算する. 2.ホストBがデータを送信し,ホストAがそれを受信し,スループットを計算する. 3.ホストAがホストBにfinishという文字列を送信する. 4.ホストBがホストAにfinish_recvを送信する. 5.プログラムを終了する. 1と2を行った後,測定終了しましたという意味のfinishをホストAからホストBに送信させます。 ホストAの動作が何らかのアクシデントで2.の途中、つまり受信処理中に止まってしまった場合, ホストBはfinishを受信するためにずっと受信状態で待つことになるとおもうのですが, ホストAは止まっているので,finishが受信されずに永遠に受信待機になると思います. このように何らかのアクシデントで受信処理が終わらなくなった場合、受信しなくても 強制的に受信処理を終わらせることはできますか? 私が考えたのは時間内にデータが送信されてこなかったら強制的に受信を止めさせるというものです. なにかよい方法はありませんか?アドバイスをしていただきたいです.

    • ベストアンサー
    • Java
  • 回答No.1
  • zwi
  • ベストアンサー率56% (730/1282)

これは別のPCとLANあるいはWANでUDP通信するということでよね? それだと単なるサーバー・クライアントシステムだと思うのですが、そういう理解で良いのでしょうか? それと、UDPはパケット・ロスト前提で組まないといけない通信プロトコルですが、そういう知識が十分に無いように見受けられますが大丈夫ですか? あとサーバー側(操作側)とクライアント側(処理側)との間でどのぐらいの頻度で通信が行われるのでしょうか? WANだと1処理が100ms程度でも厳しい場合が考えられるのですが。 >そして同じものをコピペしてソケットを利用してプロジェクト間で通信を行えばよいと考えています。 まず、afxsock.hと言うことであればCSocket クラスを使いこなす必要があるのでコンソールアプリでサーバー・クライアント間の通信の実験でしょうか。

共感・感謝の気持ちを伝えよう!

質問者からの補足

LANでUDPの通信を行いたいと思っています。 最終的にはPC間での通信を行いたいとおもいますが、まずは一つのPC内で行いたいと思います。そうすればIPアドレスとポートだけ変更することで別のPCでも同様に動作すると考えています。 私の理解では一方通行でしたらサーバー・クライアントシステムでいいと思うのですが、往復処理になるので少し理解に戸惑っていました。 ダイアログ側がサーバー?それともクライアント?1~10の流れのなかでダイアログ側からデータを入力する場合はクライアントにもなり表示の為にデータを受信する際はサーバーになるのでしょうか? ロストはしてもかまわないと思っています。周期100msで入力データをタイムスタンプと同期して投げようと思っていますので問題ないかと思っています。

関連するQ&A

  • スループット計算方法について

    私は、UDPソケットプログラミングをしています。 送信側から、受信側へ1024byteずつUDPを利用してパケットを送信しています。送信側プログラムでは、配列を1025確保し、受信側でも同様に配列を1025確保しています。 スループット計算を以下に示す計算方法で計算しました。 [送信側] (送信パケット数×パケット長(1024))/送信にかかった時間 [受信側] (受信パケット数×パケット長(1024))/受信にかかった時間 送信にかかった時間=受信にかかった時間とします。 そこで、質問させていただきます。 上記計算式で、パケット長=1024ではなく、1000で計算する方が正しいのでしょうか? よろしくお願いします。

  • TCP通信のプログラム(java)

    javaを使ってTCP通信のプログラムを作りました。 そのプログラムは次のような動作をさせたいですが、途中までしか動作確認がとれません。 1. 送信側で指定したバイト数のデータを送信する。それにかかった時間を計測する。 2. 送信されたバイトデータを受信する。届いたバイト数の確認をするとともに、受信にかかった時間を計測する。 3. 受信側は1.で行った処理と同じようにして、届いたバイト数分のデータを返信する。 4. 3.で送信側に送信されたデータを受信して、受信時間を計測する。届いたバイト数を確認する。 2.までは、正常に動作します。正常な動作とは、 送信側は、指定した数のバイトデータを送信して、それにかかった時間を計る。 受信側は、送信されたデータを受信して、それにかかった時間を計り、届いたバイト数を確認する。ちなみにこの2つの時間はほぼ同じになります。 ここまではできています。 ですが、送信側が受信側で届いたバイト数分のデータを送信し、送信側でそのデータを受信してその時間を測るというコード(//*受信処理*//という行から下)を追加するとうまくいきません。 受信側では、//*受信処理*//という行から下を追加すると、うまくいきません。 送信と受信処理のコードを載せます。 送信側(送信バイト数は入力させます) Socket sock = new Socket(host, port); BufferedOutputStream out = new BufferedOutputStream(sock.getOutputStream()); BufferedInputStream in = new BufferedInputStream(sock.getInputStream()); //*送信処理*// // 送信データを送信する。 int count = 0; // write()の回数 System.out.println("<データ送信処理>"); start = System.nanoTime(); // 計測開始時間 for (int i = 0; i < Data; i++) {   try {     out.write(i);     out.flush();     count++;   } catch (IOException e) {     System.err.println((count + 1) + "つ目のバイト:書き込みエラー");   } } stop = System.nanoTime(); // 計測終了時間 System.out.println("送信完了"); System.out.println("送信されたバイト数:" + count); // 送信スループットを計算する。 // 結果を表示する。 //*受信処理*// // 変数を定義する。 long startNs = 0; // 受信前の時間のナノ秒を返す。 long stopNs = 0; byte[] buf = new byte[1000000]; int total = 0, part; // ストリームの終わりに達し,-1が返されるまで受信する。 System.out.println("<データ受信処理>"); startNs = System.nanoTime(); while ((part = in.read(buf, 0, buf.length)) != -1) {   total += part;   System.out.println(part); } stopNs = System.nanoTime(); System.out.println("受信完了"); System.out.println("受信されたバイト数:" + total); // 受信スループットを計算する。 // 結果を表示する。 // 出力ストリーム・ソケットをクローズする。 out.close(); sock.close(); 受信側のコードは補足欄に載せます。このコードだと、 送信側の計測結果は表示されますが、受信側で受信時間や受信速度などが表示されません。 送信側で通信を強制終了すると、その後に受信側は、結果を表示します。 データを片道ではなく往復させて、それらの処理時間を計測したいのです。うまくいかないのでアドバイスを頂きたいです。 このコードのおかしい部分が分かる方はアドバイスをお願いします。 コードが見にくくて意味がわからないかもしれませんが、そうならば、データを往復させてその時間を測るためのアドバイスをお願いします。

    • ベストアンサー
    • Java
  • iモードメール送信と受信の通信料の差

    Docomoによると、iモードメールの送信と受信の通信料が違うみたいなのですが、何故なのでしょうか? (例:250字、送信4.2円、受信2.1円 目安として) パケット料金は、データ量だけで決まるみたいですが、送信、受信でデータ量がそれほど違うのでしょうか?

  • UDPで受信スループットを測定

    Javaを使って通信のプログラムを勉強しています。 UDP通信のスループットを測定するプログラムを作成しています。 送信側で5242880バイトを128回に分割して送信して、 受信側でそれらのパケットを受信する時間を計測するプログラムを 作りたいのですが、受信側でどのタイミングで受信処理を止めるのかがわかりません。 start = System.currentTimeMillis(); for(;;){   socket.receive(RecvPacket);   if(ループを抜ける条件)     break; } stop = System.currentTimeMillis(); で受信し続けて、受信するパケットがなくなったらループを抜けるというように考えました。 UDPでは送信されたパケットがすべて届くという保証はないので、 128回受信したらループを抜けるというようにできないので、困っています。 届いたパケットの数も数えて到達率も計算したいです。 受信が終わったら、ループを抜けるというようにしたいのですが、 どうすればよいでしょうか?

    • ベストアンサー
    • Java
  • ダイアログが消えない。

    Win8でウィンドウズライヴメールをダウンロードして入れました。メールの過去の受信は表示されましたが、自分宛のテストメールを送信しようとしたら、パスワードなどを聞くダイアログが出てきました。正しいデータを入れても消えず先に進みません。プロバイダーのサポートでもダメ。プロバイダーのメールソフトでは送受信はOKです。Win8のリカバリーディスクとか入っていないNotePCなので諦めた方がいいでしょうか?

  • VC++2010 TCPIP通信の受信処理について

    VC++2010 TCPIP通信の受信処理について質問させていただきました。 現在、VC++2010 MFCのダイアログ でアプリケーションを作成しています。 現在、TCPIP通信で、受信処理のプログラムの所になるんですが、 recv関数を使用してるんですが、この関数は相手側からメッセージが送信される・切断される の イベントが発生しないとrecv関数は終了しません。 ここで質問なんですが、この関数でタイムアウト時間を設けたいのですが どのようにしたら良いかわかりませんでしたので質問させていただきました。 よろしくお願いします。

  • ジョブの切り離し

    クライアント(Windows)とサーバ(Unix)の通信アプリを作っています。 ソケットプログラムはクライアント側はVBで、サーバ側はCです。 データの送受信はうまくいきました。ところが、データを送信後サーバ側でデータを解析し、その結果を印刷するというしくみなのですがこの全処理が終わらないとクライアント側に送信終了のイベントが発生しません。 クライアント側がデータを送信したら、あとはサーバ側で処理をする、というふうにしたいのです。 そこでサーバ側のアプリは次のような構造になっています。 App1(ソケットアプリ) exec でApp2 を起動 App2(データの送受信) wait あり exec でApp3 を起動 App3(データ解析)              wait なし exec でApp4,App5 を起動 wait あり、sleep あり App3以降で時間がとてもかかります。wait,sleep が入っているからですが、これはデータ解析する上で必要な手順です。データの送受信はApp2までで終わっているので、App3のプロセスを発行したらソケット切断にしたいのですが、App3が全て終わるまで待ってしまいます。 起動のさせ方でなんとかならないものかと思うのですが、どうぞアドバイスを宜しくお願いいたします。

  • ダイアログ間のメッセージの送信について

    いつもお世話になっております。 現在、Visual Studio 2005にてMFCのダイアログベースのアプリケーションを作成しており、メッセージの送信の件で詰まった箇所があり質問させて頂きました。 現在のアプリケーションの全体像なのですが、 ダイアログベースなので、アプリケーション立ち上げ時に1つメインダイアログが表示されます。 そのメインダイアログ内にボタンを設置したとして、それぞれのボタン1,ボタン2からダイアログ1,ダイアログ2をDoModal()で表示させます。 それぞれのダイアログ1,2にはボタンが1つずつ設置されているとします。 質問させて頂きたいことは メインダイアログへダイアログ1,2からメッセージ送信をする場合には ::SendMessage(GetParent()->GetSafeHwnd(),MYMSG,0); でメッセージ送信をすることは出来ました。 しかしメインダイアログから呼び出されるダイアログ1,2間でメッセージを送信する場合に,例えばダイアログ1からダイアログ2へメッセージを送信させたいときに void C****1Dlg::OnBnClicked(){ C****2Dlg m_dlg2; ::SendMessage(m_dlg2.GetSafeHwnd(),MYMSG,0); とダイアログ1のボタンクリック時の関数内にコードを入力してもダイアログ2へメッセージは送信されず(ダイアログ2内のメッセージ受信関数OnMyMsg()が呼ばれず)、そのままスルーされるようなのです。 上述のコードで何か間違えている箇所があるでしょうか? メッセージを扱うのは初めてで、とにかく相手先のウィンドウのハンドルを取得できればいいのかなと思ってコードを書いてみたのですが。。 ご存知の方がいらっしゃいましたら、ご意見宜しくお願い致します。 尚、開発環境は Windows CE 6.0 Visual Studio 2005 です。

  • PCからFOMAに画像をメールしました。この場合、FOMAで受ける際・・・

    パケット通信として画像を受信するのですか?それとも、データー通信で画像を受信するのでしょうか?パケットとして受信するならパケホーダイに入っているので"無料"なのですがデーター通信ですとかなりの枚数を送信してしまった為にとても不安です。画像の容量は1枚20KB位です。もし、仮にパケット通信で送れる場合は1枚に付き、何KB~MB位までPCから携帯に送信出来ますか?

  • C++のプログラムについて

    readfile関数を使用してPICからPCへデータを送信しようとしているのですけれど、 通信開始してからPICからのデータを変化させても受信データが変化しません。 なぜでしょうか。解決方法もおしえてください。 ちなみにPICの信号がちゃんと変わっているかはcheck済みです。 PC側プログラム if(key=='G'){ ReadFile( comHandle, &data_a, 1, &lRead, NULL ); printf("%c\n",data_a); } キーボードで'G'を入力すると受信するようにしてあり PIC側では最初'A'を出力していて、 'G'を押すとprintfで'A'を表示しますが、PIC側の信号を'B'に変化させて 'G'を押しても'B'と表示されずに'A'と表示されてしまいます。