しげです。。。
複数のalarmを取得するにはどうすればいいんでしょうか?
alarm処理ではダメなんでしょうか??
どなたかおしえてください。。

A 回答 (1件)

こんにちわ。



複数のalarmというのは、いまいち意味がつかめませんが、alarmを利用して、いくつかの関数をそれぞれある時間に起動するようにするというのであれば、同一プロセス内では無理ではないかと思います。
おそらく、threadを利用するか、alarmではなくtimer系のシステムコールとシグナルハンドラを利用した、拡張alarmを作成するなどの方法があると思います。ただ、threadで行う場合は、同期処理を考える必要があり、シグナルハンドラの場合は、呼び出される関数を再入可能にしておかないと、処理がおかしくなる可能性があるので、かなり工夫する必要があります。

参考になれば幸いです。
    • good
    • 0

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

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

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

Qエクセルのフリーズ

ノートパソコンでエクセル2003を使用しているとしょっちゅう画面がフリーズしてしまいます。
フリーズ時間は最大で5秒間程で、頻度は5秒~15秒くらいに一回とかなり頻繁です。(普通のA4サイズの書類を作るのに1時間ほど掛かります)
状態としてはフリーズ中はカーソルも止まってしまい、でもその間に入力した文字等は記憶しているらしく、フリーズが解けた瞬間一気に打ち出されるような感じです。
エクセル以外は何の問題もなく、またそのエクセルのファイルを同ネットワーク上にある他のパソコンで操作しても何の問題もないので、自分のパソコンの中のエクセル本体が壊れているかのような状態です。
どなたか助けていただけないでしょうか?
ちなみにこの現象は突然起きるようになりました。

Aベストアンサー

ソフトの不具合が原因です。再インストールをお勧めします。

Qacceptをalarmでタイムアウトさせる処理がうまくいきません

お世話になります。
C言語でソケット通信でサーバ側のaccept処理のブロック状態を
alarm関数で事前にタイムアウトする秒数を設定しておき、割り込みをおこさせて割り込み処理後、再開した際にaccept関数がエラーを返しerrnoにEINTRが返ってきているかを判断してタイムアウト処理を行うという目的で以下のソースを作成しました。
しかし、実際に動作させてみるとalarmが呼び出されシグナルハンドラとして設定しているsigcatch関数が呼び出され、標準出力にsigcatch関数中で出力しているメッセージが出力されますが、そのままブロック状態から変化しませんでした。
ソケットのクライアントプログラムを接続したところ、acceptが成功して接続が確立されました。

この方式による実現が可能かどうか、不可能であれば代替方法を教えていただきたいと考えております。

お手数おかけしますが、ご回答のほどよろしくお願いします。

コンパイルおよび実行環境は以下となっています。
Red Hat Enterprise Linux ES release 4 (Nahant Update 3)
Kernel 2.6.9-34.ELsmp on an i686
glibc-2.3.4-2.19

###################以下、C言語のソースです#####################
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

#define BUFFER_SIZE 256

void sigcatch(int);

int
main() {
unsigned short port = 9876;
int srcSocket;
int dstSocket;
struct sigaction sa_sigint;

struct sockaddr_in srcAddr;
struct sockaddr_in dstAddr;
int dstAddrSize = sizeof(dstAddr);

int numrcv;
char buffer[BUFFER_SIZE];
int status = 0;
int select_cnt = 0;

fd_set readfds;
int n;
struct timeval timeout;
int re;
char *toSendText = "This is a test";

memset(&srcAddr, 0, sizeof(srcAddr));
srcAddr.sin_port = htons(port);
srcAddr.sin_family = AF_INET;
srcAddr.sin_addr.s_addr = htonl(INADDR_ANY);

srcSocket = socket(AF_INET, SOCK_STREAM, 0);

bind(srcSocket, (struct sockaddr *) &srcAddr, sizeof(srcAddr));

listen(srcSocket, 1);

printf("Waiting for connection ...\n");

memset(&sa_sigint, 0, sizeof(sa_sigint));
sa_sigint.sa_handler = sigcatch;
sa_sigint.sa_flags = SA_RESTART;

if (sigaction(SIGALRM, &sa_sigint, NULL) < 0) {
perror("sigaction");
exit(1);
}
alarm(10);
dstSocket = accept(srcSocket, (struct sockaddr *) &dstAddr, &dstAddrSize);
if ( dstSocket == -1 ){
if ( errno == EINTR ){
printf("accept timeout!\n");
}else{
printf("accept error![%d]\n",errno);
}
exit(-1);
}
signal( SIGALRM , SIG_IGN );
printf("Connected from %s\n", inet_ntoa(dstAddr.sin_addr));

while(1) {
FD_ZERO( &readfds );
FD_SET( dstSocket , &readfds );

n = dstSocket + 1;

timeout.tv_sec = 0;
timeout.tv_usec = 0;

re = select( n , &readfds , NULL , NULL , &timeout );
select_cnt++;

if( re > 0 ){
printf("select count %d\n",select_cnt);
if ( FD_ISSET( dstSocket , &readfds ) ){
numrcv = recv(dstSocket, buffer, BUFFER_SIZE, 0);
if(numrcv == 0 || numrcv == -1) {
status = close(dstSocket); break;
}
printf("received: %s\n", buffer);
send(dstSocket, toSendText, strlen(toSendText)+1, 0);
}
}

}
}

void sigcatch(int sig) {
printf("catch signal %d\n", sig);

if (sig == SIGALRM) {
printf("catch SIGALRM and exit.\n");
}
}

お世話になります。
C言語でソケット通信でサーバ側のaccept処理のブロック状態を
alarm関数で事前にタイムアウトする秒数を設定しておき、割り込みをおこさせて割り込み処理後、再開した際にaccept関数がエラーを返しerrnoにEINTRが返ってきているかを判断してタイムアウト処理を行うという目的で以下のソースを作成しました。
しかし、実際に動作させてみるとalarmが呼び出されシグナルハンドラとして設定しているsigcatch関数が呼び出され、標準出力にsigcatch関数中で出力しているメッセージが出力されます...続きを読む

Aベストアンサー

要はacceptするときに、タイムアウトの監視もしたいということでしょうか。その場合は、alarmによる方法は採りません。
通常は、以下の方法を採ります。
acceptの前に、そのソケットに対し、selectを行います。その時、タイムアウト時間も指定します。selectから返るのは、acceptが出来る状態になったときか、selectがタイムアウトした場合の何れかです。

Qエクセルで画像を貼り付けるとフリーズしてしまう。

エクセルに画像を貼り付けるとパソコンがフリーズしてしまいます。何故でしょうか?解決方法を教えてください。

OSは、Windows2000です。
エクセルのバージョンは、2003。

Aベストアンサー

Win2000で198MBはちとキツイかな?
エクセルのバージョンが2003というのは、Office2003を入れていると思うのですが、他にアンチウィルス系も動いているのでしょうから、256MBは欲しいですね。

最近似たような質問があって、直接貼り付けるよりも問題のjpegをファイル保存しておき、エクセルの[挿入]→[オブジェクト]で実施したらどうかという回答があったばかりです。このときはワードでしたが、エクセルでもお試しみてはどうですか。

Q???ダメなんです(分からないんです)。 for文内の結果を呼び出す感じのプログラム文???

いつもいつも大変忙しい中失礼します。http://oshiete1.goo.ne.jp/qa3432182.htmlでも質問しましたが、現在そのプログラムをさらに発展させて、下記のようなプログラム文を組もうとしています。<私のプログラム文>から ”123” と入力した場合、偶数桁のみを2倍した後、 ”答え 4” の値を返そうとしていますが、相も変わらず出来ません・・・。どなたか分かる方がいらっしゃいましたらアドバイス等願います。・・・本当にいつもいつも迷惑かけます。

出力結果
数字3桁入力:”123”と入力  (余談:最終的には数字を5桁まで増やします。”12345”→”14385”と出力するつもりです。)
---計算過程---偶数桁”2”を2倍する
答え 4 ←これを導き出すことが出来ません(私の回答: 答え 2147348480 )

といいますか、返したいのですが、出来ないのです。 何故?
<参照プログラム文>を真似て、<私のプログラム文>を自分なりに作り、コンパイルは通るのですが、・・・値が期待したものと違い、どこをどういじればいいのかに悩んでいます。

<参照プログラム文>を私なりに解説させていただくと、printf文内の”triple(number)”のnumberはint xを意味しています。int triple(int x)文内のプログラムを返すらしいのです。

<私のプログラム文>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


int main()
{
int valid(int x);
int number;
int tra;


printf("数字3桁入力: ");
scanf("%d", &number);

printf("答え %d\n", valid(number));

system("PAUSE");
return 0;
}

int valid(int x)
{
int i;
int inptnum;
int tra;
for (i=3; i>=1; i--)
{
if(i%2==0){
inptnum=pow(10,i-1);
tra=(x/inptnum)%10;
tra=(tra*2)/10+(tra*2)%10;
}
return tra;
}
}

<参照プログラム文>
#include <stdio.h>
#include <stdlib.h>

int main()
{
int triple(int x);
int number;
printf("数字? \n");
scanf("%d", &number);
//printf("%d\n", number*3);

printf("%d\n", triple(number));

system("PAUSE");
return 0;
}

int triple(int x)
{
x *= 3;
return x;
}

いつもいつも大変忙しい中失礼します。http://oshiete1.goo.ne.jp/qa3432182.htmlでも質問しましたが、現在そのプログラムをさらに発展させて、下記のようなプログラム文を組もうとしています。<私のプログラム文>から ”123” と入力した場合、偶数桁のみを2倍した後、 ”答え 4” の値を返そうとしていますが、相も変わらず出来ません・・・。どなたか分かる方がいらっしゃいましたらアドバイス等願います。・・・本当にいつもいつも迷惑かけます。

出力結果
数字3桁入力:”123”と入力  (余談:最...続きを読む

Aベストアンサー

どうしてダメなのかを検証するのに希望通りの動作をしているのかチェックしてみましょう

入力された数値が正しいのか ... scanf後 numberをprintfで出力してみる

関数 validで正しく引数を受け取っているのか
valid関数の先頭で 引数xをprintfで出力してみる
for文の直後で iの値は正しいのかチェック
if ( i % 2 == 0 ) の直後で iの値が 偶数なのかチェック
inputnumへの代入が正しいかチェック
traへの代入が正しいかチェック1
traへの代入が正しいかチェック2
return文の直前でtraのデータをチェック

といった具合に printfなどで出力してみましょう

ロジック的におかしな部分があるはずです

また変数は必ず初期化して使うようにしたほうが良いと思います
代入された後の結果なのか初期化されただけの結果なのか判断が出来ますから

valid関数の中なら iはfor文で初期化されますからしなくても良いですが inputnumや traは初期化して使ったほうが良いでしょう
特に 返り値として使用する traは初期化したほうが良いと思います
初期値として計算結果としてありえない数値 -9999などで初期化するといった具合です

どうしてダメなのかを検証するのに希望通りの動作をしているのかチェックしてみましょう

入力された数値が正しいのか ... scanf後 numberをprintfで出力してみる

関数 validで正しく引数を受け取っているのか
valid関数の先頭で 引数xをprintfで出力してみる
for文の直後で iの値は正しいのかチェック
if ( i % 2 == 0 ) の直後で iの値が 偶数なのかチェック
inputnumへの代入が正しいかチェック
traへの代入が正しいかチェック1
traへの代入が正しいかチェック2
return文の直前でtraのデータをチェ...続きを読む

Qエクセルがフリーズ

エクセルで通常の使い方をしているのに、突然マウスポインターがフリーズします
何回もあります。何が原因でしょうか?パソコンはNECのノートです。

Aベストアンサー

¥Windows¥TempフォルダにEXCEL使用に
テンポラリファイルが作成されてれば、
これを削除すると改善されるかも?

むやみに消すとまずいこともありますのでくれぐれも慎重に。

Q割り込み処理から引数を取得する方法

AVRの割り込み処理なのですが、

ISR(割り込みベクタ)
{
処理;
}

みたいに書きますよね?
例えば通信の完了とかで割り込みさせて、取得した値を他の関数内で使う時にグローバル関数を使う他ないのでしょうか?
関数みたいにreturnさせたり出来ないのかなと思いまして。
returnさせても呼び出す親がいないので取得方法がわからないなと。

出来ないなら出来ないでグローバルを使います。

Aベストアンサー

タイトルの日本語がおかしい. 「引数」って何か, 理解してますか?

本題については, 端的に言って無理. というか, 割り込みで得られる値を「実際に必要とするとき」までどこにおいておくつもり?

Qエクセルのフリーズとタスクマネージャーの無反応

エクセル使用時たびたびフリーズするので困っています。(多い時は1時間で3回)
質問集で同じような症状が無いか探したのですが、見つからないので質問いたします。

エクセル使用時、リボンやシート見出し、をクリックすると画面の半分が白くなりフリーズすることがあります。
「Alt] 「Ctrl] 「Delete」 を押しても無反応なので、強制終了をします。
再立ち上げ時、セーフモードを選択しても途中で停止してしまうので、通常モードで立ち上げています。(何も無い時はセーフモードで立ち上げることができます。)

1)フリーズの原因と対処法
2)「Alt] 「Ctrl] 「Delete」を押しても反応しない原因と対処法
3)そのあとの再起動時にセーフモードが途中で停止してしまう原因と対処法
分かる方がおられましたら、お教え下さい。

OSはwindows7、office2007
エクセルのサイズは33KBから188KBです。

初めて質問しますので抜けているところがあれば追加します。
よろしくお願いします。

Aベストアンサー

そうですね。。
エクセルの再インストールは、やってみましたか?

Q複数のファイルへの一括処理(困ってます)

あるディレクトリ内の全てのファイルに同じ処理(添付のプログラムによるtest1.csvファイルに対する処理と同一の処理)をしたいと考えています。
どのようなプログラムを組めば良いのですか?

手法については検討もつかない状況です。
教えていただけないでしょうか?
よろしくお願いいたします。

(1)添付のプログラム
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
int main ()
{
FILE *fp;
char a[50];
double b;
char *p;

if((fp = fopen("test1.csv", "r")) == NULL)
return 0;
while(fscanf(fp, "%s\n", &a) != EOF){
p = strtok( a, "," );
b = atof(a);
printf("%lf ", b);
while(p != NULL)
{
p=strtok(NULL, ",");
if(p != NULL)
{
b = atof(p);
printf("%lf\n", b);
}

getch();
}
}
fclose(fp);

return 0;
}

(2)プログラムで使うCSVファイル
-749.95,1.499894061
-749.9,2.371277071
-749.85,3.01070131
-749.8,-0.92298313
-749.75,3.111961134
-749.7,-1.642278763
-749.65,2.759562723
-749.6,0.869387239
-749.55,1.400240703
-749.5,-0.574988131
-749.45,-2.282041367
-749.4,-1.104953718
-749.35,2.45568825
-749.3,-1.391859875
-749.25,-1.600438736
-749.2,0.116074589
-749.15,2.973864166
-749.1,2.652719198
-749.05,1.584699094
-749,2.129474673
-748.95,1.847275561
-748.9,2.974398019
-748.85,1.561458246
-748.8,2.897905731
-748.75,2.655075544
-748.7,-2.677451989
-748.65,-0.871814301
-748.6,-3.098832888
-748.55,2.565297638
-748.5,-2.073626148
-748.45,-0.300440285
-748.4,0.515248274
-748.35,2.983715685
-748.3,-2.47909508

あるディレクトリ内の全てのファイルに同じ処理(添付のプログラムによるtest1.csvファイルに対する処理と同一の処理)をしたいと考えています。
どのようなプログラムを組めば良いのですか?

手法については検討もつかない状況です。
教えていただけないでしょうか?
よろしくお願いいたします。

(1)添付のプログラム
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
int main ()
{
FILE *fp;
char a[50];
double b;
char *p;

if((fp = fopen("test1.csv", "r")) == NULL)
re...続きを読む

Aベストアンサー

以下のようなコードでカレントディレクトリ内のファイルを列挙できます。
FindFirstFile関数とFindNextFile関数を使います。
カレントディレクトリ以外のディレクトリのファイルを列挙したい場合は、
FindFirstFileの引数でパスを指定するか、SetCurrentDirectory関数でカレントディレクトリを移動すればいいはずです。
これで次々ファイル名が取得できるので、それぞれのファイル名でfopenして計算処理を
行えばいいと思います。


//////////////////////////////////

#include <stdio.h>
#include <windows.h>

int main(void) {
HANDLE hFind;
WIN32_FIND_DATA fd;


hFind = FindFirstFile("*.csv", &fd); /* カレントディレクトリのファイルを列挙 */

if (hFind == INVALID_HANDLE_VALUE) {
fprintf(stderr, "ファイルを取得できません。\n");
return 1;
}

/* 次々列挙 */
do {
//ファイル名の表示
printf("%s\n", fd.cFileName);

} while (FindNextFile(hFind, &fd));

/* 開放 */
FindClose(hFind);

return 0;
} //end of main

以下のようなコードでカレントディレクトリ内のファイルを列挙できます。
FindFirstFile関数とFindNextFile関数を使います。
カレントディレクトリ以外のディレクトリのファイルを列挙したい場合は、
FindFirstFileの引数でパスを指定するか、SetCurrentDirectory関数でカレントディレクトリを移動すればいいはずです。
これで次々ファイル名が取得できるので、それぞれのファイル名でfopenして計算処理を
行えばいいと思います。


//////////////////////////////////

#include <stdio.h>
#include <windows.h>...続きを読む

Qエクセルのカメラの使用時のフリーズ

こんばんは。以前、エクセル2000の不具合という内容でノートPCの欄に質問させていただきましたものですが、明確な原因がわかりましたので再度質問させていただきます。
これは会社のノートパソコン(WIN2K)でエクセル使用時にツールバーにある「カメラ」機能を使うとにフリーズしたり、数字等を入力してエンターキーを押すと12~30秒くらい時間が固まってしまう状況に陥ってしまうため困っています。
カメラで指定範囲を選択して、別の場所に貼り付けるのであくまで画像データとして取り扱われる関係でデータ量が多くなってしまうとは考えられますが、100KBほどのデータでもフリーズ状況に陥ってしまいます。
ちなみに、フリーズ状態の時のCPU使用率はずっと100%となっています。メモリーは256MBで余裕のある環境にあります。このカメラで貼り付けたデータを削除するとスムースに動く様になります。またカメラで貼り付けたエクセルファイルを開いたまま、別のカメラを使用していないエクセルファイルを使用しても、影響が及んでしまいます。
しかし、同じカメラ機能を使ったエクセルファイルを別のパソコンで開くと多少時間はかかりますが、5秒もかからないくらいで動きます。何かカメラの設定などが悪いのでしょうか?エクセルの再インストールと*.xlbファイルの削除は実行しました。長々となってしまいましたが、よろしくお願いします。

こんばんは。以前、エクセル2000の不具合という内容でノートPCの欄に質問させていただきましたものですが、明確な原因がわかりましたので再度質問させていただきます。
これは会社のノートパソコン(WIN2K)でエクセル使用時にツールバーにある「カメラ」機能を使うとにフリーズしたり、数字等を入力してエンターキーを押すと12~30秒くらい時間が固まってしまう状況に陥ってしまうため困っています。
カメラで指定範囲を選択して、別の場所に貼り付けるのであくまで画像データとして取り扱われる関係でデータ量...続きを読む

Aベストアンサー

私は、[カメラ]機能を比較的多用するので、どんな回答が付くか静観していましたが…

「メモリーは256MB」が「余裕のある環境」かどうかは分かりませんが、仰っているような現象を経験したことがありません(昔に Win2000、Excel2000 を使っていたことがありましたが、メモリサイズがどうだったかは忘れました)。
ところで、「100KBほどのデータでもフリーズ状況に陥ってしまいます」とのことですが、この「100KBほどのデータ」というのはどうやって分かったのですか?

Qwin32api複数のタイマーを同時に処理するには

いつもお世話になっています。
いま、タイマーを使ったアニメーションをやっているのですが、
SetTimer(VisualWnd,ID_YOKOUGOKI,200,NULL);
SetTimer(VisualWnd,ID_MOJIOKURI,20,NULL);
ようにすると、下のID_MOJIOKURIの部分しか処理されません。
case WM_TIMER:
switch(wParam){
case ID_YOKOUGOKI:
if(syouninkaiwa<13){
if(playeryoko==1){
playeryoko=2;
}else if(playeryoko==2){
playeryoko=3;
}else if(playeryoko==3){
playeryoko=4;
}else if(playeryoko==4){
playeryoko=1;
}
if(syouninyoko==1){
syouninyoko=2;
}else if(syouninyoko==2){
syouninyoko=3;
}else if(syouninyoko==3){
syouninyoko=4;
}else if(syouninyoko==4){
syouninyoko=1;
}
}
break;
case ID_MOJIOKURI:
if(syouninkaiwa==1){
mojiokuri+=1;
}
break;
}
InvalidateRect(VisualWnd,NULL,FALSE);
return 0;


また描画処理は
if(playeryoko==1){
BitBlt(hdcv, 250,132, 34, 32,
memdc[50], 0, 0, SRCCOPY);
}else if(playeryoko==2){
BitBlt(hdcv, 249,130, 34, 32,
memdc[55], 0, 0, SRCCOPY);
}else if(playeryoko==3){
BitBlt(hdcv, 250,132, 34, 32,
memdc[50], 0, 0, SRCCOPY);
}else if(playeryoko==4){
BitBlt(hdcv, 249,130, 34, 32,
memdc[56], 0, 0, SRCCOPY);
}
if(syouninyoko==1){
BitBlt(hdcv, 220,130, 29, 32,
memdc[51], 0, 0, SRCCOPY);
}else if(syouninyoko==2){
BitBlt(hdcv, 220,130, 29, 32,
memdc[57], 0, 0, SRCCOPY);
}else if(syouninyoko==3){
BitBlt(hdcv, 220,130, 29, 32,
memdc[51], 0, 0, SRCCOPY);
}else if(syouninyoko==4){
BitBlt(hdcv, 220,130, 29, 32,
memdc[58], 0, 0, SRCCOPY);
}
}else{
BitBlt(hdcv, 250,130, 34, 32,
memdc[50], 0, 0, SRCCOPY);
BitBlt(hdcv, 220,130, 29, 32,
memdc[51], 0, 0, SRCCOPY);
}
SetTimer(VisualWnd,ID_YOKOUGOKI,200,NULL);
SetTimer(VisualWnd,ID_MOJIOKURI,20,NULL);

if(syouninkaiwa == 0){
TextOut(hdcv,350,350,TEXT("push Enter"),lstrlen(TEXT("push Enter")));
}else if(syouninkaiwa == 1){
if(mojiokuri==1){
wsprintf(TEXT1,L"○");
}else if(mojiokuri==2){
wsprintf(TEXT1,L"○○");
}else if(mojiokuri==3){
wsprintf(TEXT1,L"○○○");
}else if(mojiokuri==4){
wsprintf(TEXT1,L"○○○○");
}else if(mojiokuri==5){
wsprintf(TEXT1,L"○○○○○");
}else if(mojiokuri==6){
wsprintf(TEXT1,L"○○○○○○");
}else if(mojiokuri==7){
wsprintf(TEXT1,L"○○○○○○○");
}else if(mojiokuri==8){
wsprintf(TEXT1,L"近頃、冒険者が多");
}
・・・・・・・・・・・・・・・・・・・・
TextOut(hdcv,20,240,TEXT1,lstrlen(TEXT1));
 
というふうです。
どちらが悪いのか分かりません。
ちなみに、タイマーの時間を同じにしたら、同時にできましたが、両方の処理が遅くなりました。
 
どのように解決したらよいのか教えてください。お願いします。

いつもお世話になっています。
いま、タイマーを使ったアニメーションをやっているのですが、
SetTimer(VisualWnd,ID_YOKOUGOKI,200,NULL);
SetTimer(VisualWnd,ID_MOJIOKURI,20,NULL);
ようにすると、下のID_MOJIOKURIの部分しか処理されません。
case WM_TIMER:
switch(wParam){
case ID_YOKOUGOKI:
if(syouninkaiwa<13){
if(playeryoko==1){
playeryoko=2;
}else if(playeryoko==2){
playeryoko=3;
}else if(playeryoko==3){
playeryoko=4;
}else if(playeryoko==4){
playeryoko=1;
}
if(syouninyoko==1){
syou...続きを読む

Aベストアンサー

コードから推察するに、原因は描画コード内のSetTimer関数の呼び出しだと思われます。

> SetTimer(VisualWnd,ID_YOKOUGOKI,200,NULL);
> SetTimer(VisualWnd,ID_MOJIOKURI,20,NULL);

まず、SetTimer関数(およびメッセージタイマー全体)の仕様を確認してください。
MSDN - SetTimer関数
http://msdn.microsoft.com/ja-jp/library/cc411200.aspx

SetTimer関数を呼び出すとuElapse引数で与えられた間隔で、WM_TIMERイベントを送り続ける仕様です。
nIDEventで識別されるタイマーが既に設定されていた場合、タイマーはリセットされます。

描画コードがWM_PAINTメッセージで処理されると仮定すると、
WM_TIMER→InavlidateRect()→WM_PAINT送出→SetTimer()が呼び出され、どちらのタイマもリセットされる。
ID_MOJIOKURIのタイマの方がID_YOKOUGOKIより高頻度なため、
高確率でID_MOJIOKURIが処理されているように見える…のではないかと思います。
提示されたコードからの推測ですので、確証はありませんが。

コードを見る限り、描画コード中のSetTimer関数呼び出しは不要に思えます。
ひとまず、描画コード中のSetTimer関数呼び出しは削除し、
タイマが不要になったらKillTimer関数を呼び出すように変更してみてはいかがでしょうか。


また、蛇足ですがメッセージタイマは55ms程度の精度しかありません。
ID_MOJIOKURIで20msを指定されていますが、実際にはその間隔での処理は期待できません。
文字送りですので、特に問題ないと思いますけど。

コードから推察するに、原因は描画コード内のSetTimer関数の呼び出しだと思われます。

> SetTimer(VisualWnd,ID_YOKOUGOKI,200,NULL);
> SetTimer(VisualWnd,ID_MOJIOKURI,20,NULL);

まず、SetTimer関数(およびメッセージタイマー全体)の仕様を確認してください。
MSDN - SetTimer関数
http://msdn.microsoft.com/ja-jp/library/cc411200.aspx

SetTimer関数を呼び出すとuElapse引数で与えられた間隔で、WM_TIMERイベントを送り続ける仕様です。
nIDEventで識別されるタイマーが既に設定されていた場合、タイ...続きを読む


人気Q&Aランキング

おすすめ情報