こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

スレッドを使ったプログラムの不具合

スレッドを作成し、そこで円を移動させるプログラムを試しているのですが、何度も試していると突然円の動きが急激に遅くなり、その後はずっと遅いままです。他に起動しているソフトのせいかと思い、それらを終了してみても変わりませんでした。
しかし、なぜかVisual C++ 2010 Expressにある、出力タブの下側のスクロールバーの上をマウスを上下に移動させるとその瞬間だけ円の動くスピードが正常に戻ります(画像の赤丸の部分)。
Visual C++ 2010 Expressの設定に問題があるのか私のプログラムに問題があるのか全く分かりません。
どうすれば改善できるか教えてください。

#include<Windows.h>
#include<process.h>
#define CIRCLEMOVE 2
#define CIRCLESIZE 36
POINT pt;
BOOL xadd=TRUE,yadd=TRUE;

#define APP_NAME TEXT("SampleMainWindow")


LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);


void ThreadFunc(LPVOID hWnd){
RECT rc;
for(;;){
if(xadd)pt.x+=CIRCLEMOVE;
else pt.x-=CIRCLEMOVE;
if(yadd) pt.y+=CIRCLEMOVE;
else pt.y-=CIRCLEMOVE;
GetClientRect((HWND)hWnd,&rc);
if(pt.x+CIRCLESIZE >=rc.right){xadd=FALSE;}
else if(pt.x<=0){xadd=TRUE;}
if(pt.y+CIRCLESIZE >=rc.bottom){yadd=FALSE;}
else if(pt.y<=0){yadd=TRUE;}
InvalidateRect((HWND)hWnd,NULL,FALSE);
Sleep(5);
}
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow){

WNDCLASS wc;
HWND hWnd;
MSG msg;

wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=WindowProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=NULL;
wc.hCursor=LoadCursor(NULL,IDC_ARROW);

wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName= APP_NAME;
if (!RegisterClass(&wc)){
MessageBox(NULL,NULL,NULL,MB_OK);
return 0;
}

hWnd=CreateWindow(APP_NAME,
TEXT("window title"),WS_OVERLAPPEDWINDOW^WS_THICKFRAME^WS_MAXIMIZEBOX,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);

ShowWindow(hWnd,nCmdShow);

while(GetMessage(&msg,NULL,0,0)>0){

DispatchMessage(&msg);
}
return msg.wParam;
}


LRESULT CALLBACK WindowProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp){

static RECT rc;
HDC hdc;
static HDC hmemDC;
static HBITMAP hbitmap;
PAINTSTRUCT ps;
switch(msg){

case WM_CREATE:
hdc=GetDC(hWnd);
GetClientRect(GetDesktopWindow(),&rc);
hmemDC=CreateCompatibleDC(hdc);
hbitmap=CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
ReleaseDC(hWnd,hdc);
SelectObject(hmemDC,hbitmap);
_beginthread(ThreadFunc,0,(void*)hWnd);
break;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
SelectObject(hmemDC,GetStockObject(WHITE_PEN));
SelectObject(hmemDC,GetStockObject(WHITE_BRUSH));
Rectangle(hmemDC,0,0,rc.right,rc.bottom);
SelectObject(hmemDC,GetStockObject(BLACK_PEN));
Ellipse(hmemDC,pt.x,pt.y,pt.x+CIRCLESIZE,pt.y+CIRCLESIZE);
BitBlt(hdc,0,0,rc.right,rc.bottom,hmemDC,0,0,SRCCOPY);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}

return DefWindowProc(hWnd,msg,wp,lp);
}
--- 実行環境 ---
Microsoft Visual C++ 2010 Express
WIN32 ユニコードビルド
C言語

投稿日時 - 2017-12-28 22:12:18

QNo.9412678

困ってます

回答(0)

この質問にはまだ回答がついていません。
あなたが最初に回答してみませんか?