ツイッター用のボットを作成しています。
SetTimer関数で処理待ちしているときにOSがスリープ状態になるとソケットの処理部分でエラーになってしまいます。
このスリープを回避することは可能なのでしょうか?
①スリープ状態でもソケット通信を可能にする方法
②ソケット通信するときだけスリープを解除してソケット通信する方法
一番望ましいのは①ですが、不可能もしくは②の方が簡単であれば②でもいいです。
OSがスリープ状態であるときのプログラムについて
Re: OSがスリープ状態であるときのプログラムについて
(1) の方法は難しいです
そもそもTwitterBOTは常時起動しているようなサーバーで動かすのが普通だと思います。
Mac OS X には Power Nap というスリープ中に通信する機能があるようですが、サードパーティ用のAPIは提供されていないようです。
(2) はOSによってAPIが異なるのでOSがわからないと答えられないです。
そもそもTwitterBOTは常時起動しているようなサーバーで動かすのが普通だと思います。
Mac OS X には Power Nap というスリープ中に通信する機能があるようですが、サードパーティ用のAPIは提供されていないようです。
(2) はOSによってAPIが異なるのでOSがわからないと答えられないです。
Re: OSがスリープ状態であるときのプログラムについて
すみませんでした。環境を書き忘れていました。h2so5 さんが書きました:(1) の方法は難しいです
そもそもTwitterBOTは常時起動しているようなサーバーで動かすのが普通だと思います。
Mac OS X には Power Nap というスリープ中に通信する機能があるようですが、サードパーティ用のAPIは提供されていないようです。
(2) はOSによってAPIが異なるのでOSがわからないと答えられないです。
OSはWindows XP以降で、開発はWin32APIとWinSockをメインにVC++2010で行っております。
通常時(OSアクティブ状態)での動作チェックは問題ないです。
スリープ状態のことを思い出したので、この機能は後付という感じになってしまいます。
最悪、仕様ということでBOT起動中はスリープ状態にならないようにするということも考えましたが、
それはホントに最期の手段ということでいろいろ調べていましたが、自分では見つけられませんでした。
ということで最後の最後で質問してみようということで今回の質問に至りました。
Re: OSがスリープ状態であるときのプログラムについて
わざわざURLまでありがとうございます。h2so5 さんが書きました:Windowsの場合はSetThreadExecutionStateを呼び出します
http://msdn.microsoft.com/ja-jp/library/cc429178.aspx
http://d.hatena.ne.jp/aont/20100121/1264089608
http://stackoverflow.com/questions/6302 ... idle-state
SetTimerの前にSetThreadExecutionState(ES_SYSTEM_REQUIRED | ES_CONTINUOUS);こう書けばいいわけですよね?
その後必要がなくなりスリープになってもいい状態(KillTimerの後)になったらSetThreadExecutionState(ES_CONTINUOUS);で解除ということですね?
この場合だとこのプログラムが動作している間はスリープを制御できるようですが、
待機中はスリープさせといて、通信する間だけ解除というのはできないのでしょうか?
仮にスリープ移行が1分で、その9分後(プログラム起動から10分後)に通信し、9分30秒後には通信完了してまた待機としましょう。
[例]
プログラムの起動 12:00
スリープ 12:01~12:09
通信 12:10~12:10.30
スリープ 12:10.30~
プログラム停止
上記のようにしたいのですが、これは可能ですか?
Re: OSがスリープ状態であるときのプログラムについて
決まった時間に(定期的にでも一回限りでも)パソコンをスリープから起こし、何かタスクを実行するにはWindows標準の「タスクスケジューラ」が使えます。
タスクスケジューラは「コントロールパネル」の「管理ツール」に入っているはずです。
タスクスケジューラで新しいタスクを作成し、「条件」タブで「タスクを実行するためにスリープを解除する」をチェックすると、パソコンがスリープしていても起きてからタスクが実行されます。
以上は手動での操作ですが、タスクの作成をプログラムからやる方法は僕は知りませんので他の方に譲ります。
タスクスケジューラは「コントロールパネル」の「管理ツール」に入っているはずです。
タスクスケジューラで新しいタスクを作成し、「条件」タブで「タスクを実行するためにスリープを解除する」をチェックすると、パソコンがスリープしていても起きてからタスクが実行されます。
以上は手動での操作ですが、タスクの作成をプログラムからやる方法は僕は知りませんので他の方に譲ります。
Re: OSがスリープ状態であるときのプログラムについて
SetSuspendStateとSetWaitableTimer組み合わせでできると思います
http://msdn.microsoft.com/ja-jp/library/cc429355.aspx
http://msdn.microsoft.com/en-us/library/aa373201.aspx
サンプルコード
http://stackoverflow.com/questions/1141 ... ve#tab-top
http://msdn.microsoft.com/ja-jp/library/cc429355.aspx
http://msdn.microsoft.com/en-us/library/aa373201.aspx
サンプルコード
http://stackoverflow.com/questions/1141 ... ve#tab-top