プロが教えるわが家の防犯対策術!

アラーム情報などをBASP21を用いてE-Mail送信するプログラムを
マルチスレッドにしていました。
自己メールサーバーを立てていた場合は、1秒間に何件でもセッション
張ってもよかったのですが、訳あってOCNのメールサーバーを使うように
したところ、1秒間に複数のセッションを張ると迷惑メール送信
と認識されるため、接続が拒否されていまいます。

そこで、マルチスレッド化しているアラームメールの起動間隔を伸ばす
ためにAfxBeginThreadの後に

Sleep( 5* 1000 );

を入れて1秒間に複数送信しないようにしたつもりなんです
が、何故かSleepが効かな状況です。

エラー内容としては、次のように表示されます。
Too Many Session 421
細かく見ていくと、状況によって次のエラーでした。
http://homepage1.nifty.com/yito/anhttpd/winsock_ …
10060 WSAETIMEDOUT
10061 WSAECONNREFUSED Connection refused

ログを見てもスリープが効いておらず、間隔なしにアラームメールが
1秒間に10件近く送信されてしまいます。


一応渡されたスレッドの最後に
AfxEndThreadを書いてみたり書かないようにしてみたんですが、
状況は変わらずです。

#include "stdafx.h"
#include "windows.h"

for( i=0;i<ALARM_MAX;i++ ){
m_pThreadCL[i] = AfxBeginThread(ThreadProcCL, (LPVOID)i,THREAD_PRIORITY_NORMAL)
Sleep( 5 * 1000); //::Sleep( 5 * 1000 );の間違い?
}
念の為
スレッド起動をしなければいいのですが、単純にはいかなかった
ため、応急処置としてスレッドの起動間隔を遅延させる方法を
どうにかできないものでしょうか。あくまでも応急処置として、
お願いいたします。

A 回答 (1件)

AfxBeginThreadの 引数dwCreateにCREATE_SUSPENDEDを指定してスレッドを作成するようにしてみてはいかがでしょう



その後 ResumeThreadメソッドでスレッド起動
WaitForSingleObjectなどを使ってスレッドが終了する毎に次スレッドのResumeThreadを呼んでみてはいかがでしょう ...

for(i=0; i< ALARM_MAX;i++) {
m_pThread[i] = AfxBeginThread( ThreadProcCL,(LPVOID)i,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
}

for( i=0; i<ALAM_MAX; i++) {
m_pThread[i]->ResumeThread();
while( WaitForSingleObject( m_pThread[i]->m_hThread, 100 )!= WAIT_OBJECT_0) {
Sleep( 5 * 1000 );
}
}

この回答への補足

while( WaitForSingleObject( m_pThread[i]->m_hThread, 100 )!= WAIT_OBJECT_0) {
このコードは、プログラムが転けるので。

while( WaitForSingleObject( m_pThread[i]->m_hThread, 100 )!= WAIT_OBJECT_0) {
こちらで良いのかと思いましたが・・・。

他のサイトでもこちらの書き方が多いですし。
後述のコード内容の認識として、100msec間隔でシグナル状態になっているか判断して抜けると思いますが、自信がありません。orz。

 今回のことは大変役に立ちました。
もう一度VC++を勉強していこうかなぁと思いました、ありがとうございました。

補足日時:2007/06/11 10:25
    • good
    • 0

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