VC++2008にて、サーバとクライアントPCの相互通信により、
クライアントPC側で、サーバデータを表示する
エクスプローラもどきを作成しています。

サーバ側は、複数台のPCと送受信を行うため、
通信部分をマルチスレッド化しているのですが、
クライアント側は、基本的には、シングルスレッドでOKと考え、
通信部分はマルチスレッド化していませんでした。


クライアントで、ファイルアイコンをクリックしたら、
ファイルデータを受信して、ファイルをオープンし、
クローズすると、サーバへ上書きしに行く部分を、
マルチスレッドにて作成しました。
(ファイルオープンの箇所からマルチスレッド化)

問題が起こっているのは、クローズ後に、
ファイル上書きのために、CSocket派生クラスをCreateすると
落ちてしまうことです。

シングルスレッドでは、Createも正常に通るので、
マルチスレッドから、Createを呼んでることが
原因だとは思うのですが、なぜ原因となっているのか?
また、どのように修正すれば良いかが分かりません。

説明が分かりづらいかもしれませんが、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

こちらを参照してください。


http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/ …

この回答への補足

CSocket/CAsyncSocketは使うべきではないということですか。
ということは、今回の件も回避策は無いということになりますね。。。

期限の面から、通信を刷新するのは
かなり厳しいので、出来れば、今回はこの点だけを
修正できることが希望だったのですが、
仕方がないのでしょうね。

補足日時:2009/05/12 12:20
    • good
    • 0
この回答へのお礼

別スレッドを作成したのに、AfxSocketInit()を呼んでいなかったことが
原因でした。

ただし、CSocket/CAsyncSocketには根本的なバグが
あるようですし、機会を見て刷新しようと思います。
ありがとうございました。

お礼日時:2009/05/12 16:55

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QM30x500

M30x500
このサイズのボルトは
作成可能でしょうか
(S45C)

Aベストアンサー

 おはようございます。

 念のために誤解の生じにくい表記に直します。M三十×五百、に間違いありませんね?
 ネジ寸法の表記の仕方は、
1.先ずアルファベットを1から数文字でネジ規格を示します。この場合Mはメートル単位系の略号。
2.次の数字はネジの外径寸法。外径、即ち一番径の大きい部分です。
3.本来だと次は、×のあとにピッチ寸法(ネジ山の大きさ)が来ます。例えばM10×1.5は普通の10ミリのネジですが、ネジ1回転が長さ1.5ミリに相当します。ネジの谷の深さの寸法はこの数字の半分になります(=正三角形の辺の長さの半分)。念のために書いておくと外径が同じでピッチの小さな「細目(サイメ)」ネジの規格も定められています。
 以上から質問にある「×500」というのは、ピッチとは考えられないため、ボルトの全長を指しているのではないかと推測します。

 結論。
 M30の並目(普通)ネジだとすると、規格は×3.5ということになります。これを500の長さで作ることは旋盤屋にすればごく普通の仕事で、通常使用している汎用旋盤で十分に加工が出来る大きさです。
 
 差し当たり見つけたこちらは材質、外径、長さすべてが違いますが、探せば既製品があるかもしれません。少なくとも長さに関してはメートル単位のものが市販されているはずです。
http://www.monotaro.com/p/3471/2736/

 おはようございます。

 念のために誤解の生じにくい表記に直します。M三十×五百、に間違いありませんね?
 ネジ寸法の表記の仕方は、
1.先ずアルファベットを1から数文字でネジ規格を示します。この場合Mはメートル単位系の略号。
2.次の数字はネジの外径寸法。外径、即ち一番径の大きい部分です。
3.本来だと次は、×のあとにピッチ寸法(ネジ山の大きさ)が来ます。例えばM10×1.5は普通の10ミリのネジですが、ネジ1回転が長さ1.5ミリに相当します。ネジの谷の深さの寸法はこの数字の半分になりま...続きを読む

Qマルチスレッドvsシングルスレッド どちらが速いか

サーバープログラムおいて、
Aさんからa'というデータを受け取ってメモリ上のデータを書き換え、データ検索をし、該当箇所a''の前回との差分を求めてBYTE配列に置き換えて送信
Bさんからb'というデータを受け取ってメモリ上のデータを書き換え、データ検索をし、該当箇所b''の前回との差分を求めてBYTE配列に置き換えて送信
・・・・・・・・・
というプログラムを組みたいのですが(クライアント人数は不明)、マルチとシングルどっちの方が速いのでしょうか?

Aベストアンサー

競合が無ければマルチの方が速いと思うけど、クライアントとの
接続とか、データの受け渡しのタイミングとかはどうなっているんでしょう?

要求が非同期にクライアントからあがってくるなら、マルチで書いたほうが
自然です。

多分いろいろ前提条件が抜けてます。

QVAIO typeM VGC-M30W のライン入力コネクタに繋ぐコードって何を買えばいいの?

VAIO typeM VGC-M30W にカセットの音楽を取り込みたいのですが、ライン入力コネクタにどんなコードを繋げばいいのでしょうか?

例えば、モノなのかステレオなのかも分かりません。
ご存知の方教えてください。

Aベストアンサー

ステレオミニプラグですね。
マイク端子ではないので抵抗は必要無いでしょう。

Qマルチスレッド絡み?マルチなサーバ処理をリアルタイムにブラウザに返す方法が…

C++自体は割りとやってますが、マルチスレッド、通信、JavaScriptは初心者からの質問させて頂きます。

うまく伝わるかどうか心配なのですが、
要は以下のような処理イメージです。
--
ブラウザ上で、[開始]ボタンを押したら、サーバー上で処理1が実行されます。
その後、ブラウザ上では「処理1実行中」と表示されます。
その間、更にもう一度[開始]ボタンを押すと、サーバ上で処理1と同じ処理が処理2として実行されます。
処理1、処理2それぞれ処理が終わると、終わったものからブラウザ上に「完了」と表示されます。
--
伝わりますでしょうか?
このような処理で、特に分からないポイントがあります。
サーバで処理を実行開始した時点で、一度ブラウザに応答しておいて、処理を返し、処理が終了した時点で再度ブラウザに完了を通知する方法です。

ブラウザから処理されるアプリはサーバアプリ一つだと思うし、そこからマルチスレッドでは?と考えると、終わるまで処理を返せないのかなと。。。
(アホな文章になってそう。。。)

図にすると以下のようになるでしょうか?
ブラウザ - サーバアプリ間はJavaScript
サーバアプリ - 処理1(処理2)はC++です。
サーバアプリと処理1(処理2)は同じExe内でできるのならそれでも可です。

--
ユーザー(ブラウザ)
   ↓ ↑
サーバアプリ(C/C++)
 ↓  ↓  ↓
処理1 処理2 処理3(C/C++)

なるべく定期的に監視するようなタイマーとか使わないで実現可能にしたいです。
どなたかアドバイスお願いします!!

C++自体は割りとやってますが、マルチスレッド、通信、JavaScriptは初心者からの質問させて頂きます。

うまく伝わるかどうか心配なのですが、
要は以下のような処理イメージです。
--
ブラウザ上で、[開始]ボタンを押したら、サーバー上で処理1が実行されます。
その後、ブラウザ上では「処理1実行中」と表示されます。
その間、更にもう一度[開始]ボタンを押すと、サーバ上で処理1と同じ処理が処理2として実行されます。
処理1、処理2それぞれ処理が終わると、終わったものからブラウザ上に「完了...続きを読む

Aベストアンサー

概念的にはCometみたいなことをやりたいということでしょうか?
http://www.atmarkit.co.jp/fjava/rensai4/safetomcat_03/safetomcat_03_1.html

上記例ではサーバをTOMCAT&Javaで実現していますが、サーバを自前で実装しているのならアイディアを流用することは可能だと思います。

サーバアプリはaccept後、要求処理を行うスレッドを起動し処理が終了したら実行結果をHTTP RESPONSEにして返答します。

クライアント側はボタンが押されたら「実行中」という表示に変更した後に、JavaScriptのHttpRequestを利用してサーバに対して処理の実行を要求します。
HttpResponseで結果が返ってきたら内容を利用して完了告知を行います。
JavaScriptのHttpRequestを利用することにより、ページ遷移を伴わずに処理の終了をクライアントに通知することができます。

サーバ側のプログラムの組み方については、開発環境や実装方針によって大きく変わる(Apatchを利用するのか、自前で組むのか、Windowsなのか、UNIX系なのかなどによって異なる)ので、ここでは省略させてもらいます。

概念的にはCometみたいなことをやりたいということでしょうか?
http://www.atmarkit.co.jp/fjava/rensai4/safetomcat_03/safetomcat_03_1.html

上記例ではサーバをTOMCAT&Javaで実現していますが、サーバを自前で実装しているのならアイディアを流用することは可能だと思います。

サーバアプリはaccept後、要求処理を行うスレッドを起動し処理が終了したら実行結果をHTTP RESPONSEにして返答します。

クライアント側はボタンが押されたら「実行中」という表示に変更した後に、JavaScriptのHttpRequest...続きを読む

Qaudio-technica ATH-M30

audio-technica モニターヘッドホン [ATH-M30]について聞きたいのですが、使っていくうちにイヤーパッドがボロボロになると思うのですが、ヘッドパッドも同様に使っていくうちにボロボロになったりしますか?

Aベストアンサー

たぶん、どちらも同じ合成皮革を使用しているでしょうから、同じように劣化します。

私はSonyのヘッドホンで経験しました。
そのときはオレンジオイルなどで表面のベトベトになった部分を落としてしまいました。
ヘッドパッドのほうは『皮』を剥いてしまいました。

Q親スレッドが子スレッドを監視する方法について(マルチスレッド)

こんにちは。
私は、A端末から送信されたパケットをB端末で受信し、B端末で受信したそのパケットを再度、A端末へ送信するというプログラムを作成しました。

Phase1.A端末(送信側)→B端末(受信側)
Phase2. B端末→A端末
ということです。

上記を実現するために、送信端末において、送信スレッド(親スレッド)と受信スレッド(子スレッド)を立てマルチスレッド処理を行っています。以下にプログラムの概要を示します。

main(int argc ,char *argv[]){
UDPSend(s_port,szServer);
}

static int UDPSend(unsigned short s_port,char *szServer){
hTh = (HANDLE)_beginthreadex(NULL, 0, UDPReceiveData, NULL, 0, &thID);
while((n = fread(send_Buf,1,SEND_DATA_SIZE,fp)) != 0) {
sendto(s1, send_Buf, n, 0, (LPSOCKADDR)&addrin1, sizeof(addrin1));
}
}
unsigned __stdcall UDPReceiveData(void *lpx){
while (1) {
size = recvfrom(s2, recv_Buf, (int)sizeof(recv_Buf) - 1, 0, (SOCKADDR *)&from, &fromlen);
return 0;
}
}

UDPSend関数にて、パケットをB端末へ送信。UDPReceiveData関数にて、B端末からのパケットを受信しています。この場合、UDPSend関数(スレッド?)がUDPReceiveData関数より先に、終わってしまう場合が生じると思っているのですが。

UDPSend関数がUDPReceiveData関数を監視する方法があるのでしょうか?

よろしくお願いします。

こんにちは。
私は、A端末から送信されたパケットをB端末で受信し、B端末で受信したそのパケットを再度、A端末へ送信するというプログラムを作成しました。

Phase1.A端末(送信側)→B端末(受信側)
Phase2. B端末→A端末
ということです。

上記を実現するために、送信端末において、送信スレッド(親スレッド)と受信スレッド(子スレッド)を立てマルチスレッド処理を行っています。以下にプログラムの概要を示します。

main(int argc ,char *argv[]){
UDPSend(s_port,szServer);
}

static int UDPSe...続きを読む

Aベストアンサー

「スレッドの生成~終了待ち~ハンドル解放」を main() でやってみてはいかがですか?
#include <windows.h>
#include <stdio.h>
#include <process.h>
main(){
  HANDLE hTh;
  unsinged thID;
  hTh = createthreadex(省略);
  送信処理();
  WaitForSingleObject( hTh, INFINITE ); //受信スレッド終了待ち
  CloseHandle(hTh);
}
送信処理(){
  ・・・・
  sendto(省略);  
  ・・・・
}
受信処理(){
  ・・・・
  recvfrom(省略);
  ・・・・
}

参考URL:http://msdn2.microsoft.com/ja-jp/library/kdzttdcb.aspx

Qデジカメ購入で迷ってます Optio M30  DSC-W35

初めてのデジカメ購入で同じくらいの価格で販売していたペンタックスのOptio M30 かソニーのDSC-W35 の二つに候補を絞ったのですが、どちらにしようか決めかねています。どちらのほうが良いのかどなたかかアドバイスよろしくお願いいします。

Aベストアンサー

こんばんは。

媒体に拘りが無ければSONYを勧めます。
後々いろんな人がレスを入れるとは思いますが、個人的にコンデジで望遠ズームを必要としない場合、何を求めるかによるのですが私はF値を重視します。
F値とは下のURLに詳しく書いてありますが、簡単に言えばレンズの明るさでありこの数値が低ければ低いほど明るい写真が取れるのです。

http://ja.wikipedia.org/wiki/F%E5%80%A4

これを比較した場合SONYは2.8~5.2、ペンタは3.1~5.9ということを考えるとこの差はかなり大きいです。(私も画素数は違うにせよリコーCaplioR5とオリンパスC-760で比較したのですが、オリンパスの方が明るかったです)

ただペンタの場合は最低感度(ISO)が64~3200と広範囲に対し、SONYは100~1000としょぼい部分はありますけどペンタの場合HOYAとの吸収合併の問題もあり、今私がどっちか?と問われれば撮影目的次第でしょうね。
夜間や暗闇撮影が多いならペンタ、通常ならSONYという結論です。

Qスレッド内でのマルチスレッドの作成[WINDOWSプログラミング]

いつもお世話になっております。

現在WINDOWSプログラムでゲームを最中なのですが、スレッド内でスレッドを作成できなくて困っています。
キャラを動かすスレッドで以下の関数を使い、スレッドを作成しようとしたのですが、

CreateThread(NULL, 0, ATK, (LPVOID)&x, 0, &dwID);

以下のようなエラーメッセージが出てしまいます。

'ATK':定義されていない識別子です
'関数' : 間接参照のレベルが 'LPTHREAD_START_ROUTINE' と 'int' で異なっています。
'CreateThread' : の型が 3 の仮引数および実引数と異なります。

わかる方いましたらどうがご指導お願いします。
初歩的なミスでしたらすみません。

Aベストアンサー

構造体ではなくて
DWORD ATK(LPVOID param);
のようなプロトタイプ宣言がCreateThread( )関数の前に必要ということです

QCANON FV M30 KIT 充電できなくなりました

CANON FV M30 KITユーザです。
突然充電ができなくなりました。

テープを再生していたところ、バッテリー切れになったので、DCアダプタをつけたのですが、充電ランプが点滅しません。

アダプタの線が途中で切れたのでしょうか?
買ってからまだ2ヶ月しか経ってないし、切れるような使い方もしてなかったと思うのですが…。

同じようなトラブルがあった方、いらっしゃいませんか???

Aベストアンサー

こんにちは。充電ができないとのことですが、
アダプターをつけた状態で本体の電源は入りますか?
正常に動作するようであれば、アダプターよりも
本体もしくはバッテリーの方に問題があると思われます。
考えられる原因としては主に
1.充電回路(基板)の故障
2.充電ランプの断線
3.バッテリーの故障(不良)があげられます。
お使いの機種がM30との事ですので。
緊急に使う予定がないのであればアダプターを含め
一度、購入店もしくはメーカーに点検を依頼されてみてはいかがでしょうか?
もし、修理が必要な場合でも発売間もない機種ですからメーカー保証は当然ありますので…。
無料修理の対象になると思われます。

Qsshクライアントで接続先で開いたウィンドウもクライアント側で表示できるもの

sshクライアントで接続先で開いたウィンドウもクライアント側で表示できるものを探しています。(説明ヘタクソですみません)

普段はTera Termを使っているのですが、OpenGLのプログラムを動かしたいので上記のようなソフトがほしいのです。

よろしくお願いします。

Aベストアンサー

クライアント側で、Xサーバーを動かします。サーバー側でプログラム起動時にDISPLAY環境変数で、192.168.0.1:0.0 のようにディスプレイ名を指定します。
「Windows Xサーバー」で検索してみてください。フリーの物、有償の物があります。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報