トップページ > 過去ログ > 記事閲覧
非同期でのConnectNetWorkについて
名前:まこ 日時: 2011/10/26 01:11

いつもDXライブラリにはお世話になっています。 質問なのですが、接続処理を非同期で行いたいと思い 別スレッドでConnectNetWorkする方法を試みています。 が、別スレッドでConnectNetWorkを呼び出すとそのまま処理が固まってしまい正常に動作しませんでした。 関係ないとは思いましたがSetMultiThreadFlag( TRUE )をためしても同様の結果でした。 仕様なのかわかりませんが、 もしそうでしたら、非同期で接続処理をする別の方法を教えていただけると助かります。

Page: 1 |

Re: 非同期でのConnectNetWorkについて ( No.1 )
名前:いっち 日時:2011/10/27 00:37

とりあえず、再現用のソースです。サーバ側は何でもいい(いらない)と思います。 原因や対策などは調べていません。 //- 以下、テストコード -// #include <process.h> #include "DxLib.h" bool quit_thread; int nh = -1; unsigned int WINAPI MyThread( void* ) { IPDATA Ip = { 192, 168, 0, 1 }; while ( 1 ) { if ( (nh = ConnectNetWork( Ip, 9850 )) != -1 ) { break; } if ( quit_thread == true ) break; Sleep( 500 ); } _endthreadex( 0 ); return 0; } int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) { ChangeWindowMode( TRUE ); SetDoubleStartValidFlag( TRUE ); SetAlwaysRunFlag( TRUE ); SetWindowText( "DxLib:" DXLIB_VERSION_STR ); if ( DxLib_Init( ) == -1 ) return -1; int white = GetColor( 255, 255, 255 ); quit_thread = false; unsigned int thread_id1; HANDLE thread_handle1 = (HANDLE)_beginthreadex( NULL, 0, &MyThread, 0, 0, &thread_id1 ); SetDrawScreen( DX_SCREEN_BACK ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { ClearDrawScreen( ); DrawFormatString( 0, 0, white, "TEST:%d", nh ); ScreenFlip( ); } quit_thread = true; WaitForSingleObject( thread_handle1, INFINITE ); CloseHandle( thread_handle1 ); CloseNetWork( nh ); DxLib_End( ); return 0; }
Re: 非同期でのConnectNetWorkについて ( No.2 )
名前:まこ 日時:2011/10/27 21:29

わざわざ再現用ソースありがとうございます。 管理人さんが来るまでDXライブラリのソースを眺めつつ、待ってみます
Re: 非同期でのConnectNetWorkについて ( No.3 )
名前:管理人 日時:2011/10/30 21:08

現在公開しているDXライブラリでは ConnectNetWork をメインスレッドとは別に立てたスレッドで 呼ぶという方法で非同期に接続処理を行うということはできません 非同期接続用の ConnectNetWork は割と簡単に作成できそうなので、状況次第で1週間〜1ヶ月以上 くらいの期間のぶれはありますが、実装してみたいと思います ただ、DXライブラリではあんまり難しいことをしていないので WinSock を直接お使いになった方が 良いかもしれません (・・;
Re: 非同期でのConnectNetWorkについて ( No.4 )
名前:まこ 日時:2011/10/31 20:22

>>管理人 様 お返事ありがとうございます。 >>非同期接続用の ConnectNetWork は割と簡単に作成できそうなので、状況次第で1週間〜1ヶ月以上 >>くらいの期間のぶれはありますが、実装してみたいと思います おお!ありがとうございます! そしてものすごくお手数をお掛けします; とりあえず同期での接続か、のんびりと実装されるのを待っています。 DXライブラリだけでも、工夫次第でこんなのも作れるよー的なものを作りたいので WinSockはできるだけ避けたいんですよね(・・; このような素敵なライブラリを開発していただきありがとうございます。
Re: 非同期でのConnectNetWorkについて ( No.5 )
名前:管理人 日時:2011/11/07 00:01

非同期接続用の ConnectNetWork を追加したバージョンをアップしましたので、 よろしければダウンロードしてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCCTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMinGWTest.exe // MinGW 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 追加した関数は ConnectNetWork_ASync という関数で、引数は ConnectNetWork と全く同じです 違いは、接続の完了を待たずに関数から出てくるという点です 接続が完了したかどうかは GetNetWorkAcceptState で判断してください あと、接続メッセージなどの処理を ProcessMessage で行っていますので、 接続待ちループをする際は必ずループ内に ProcessMessage を挟むようにしてください

Page: 1 |