线程级别的问题

CreaTive1911 2003-03-25 03:47:59
这学期开了操作系统的课程, 前些天老师出了一道题,在一DIALOG内用5种级别线程分别控制5进度条, 可我的5进度条就是以一样的速度前进,老师又只会MFC,而我因为现在在学SDK,所以老师也不清楚。。。。。郁闷。。。我CREATETHREAD时线程是挂起状态,设置线程级别后再 ResumeThread 到底是哪里出了错呀。。。
...全文
43 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
CreaTive1911 2003-03-25
  • 打赏
  • 举报
回复
原代码我也不少.....你贴的这个我有书,
。。。
guoxiny 2003-03-25
  • 打赏
  • 举报
回复
MFC深入浅出的代码,看看吧!
//--------------------------------------------------------------------
// mltithrd.h
//--------------------------------------------------------------------
#define IDM_RESUME 1
#define IDM_SUSPEND 2
#define IDM_FOR 3
#define IDM_SLEEP 4
#define IDM_NODELAY 5

#define HIGHEST_THREAD 0x00

#define ABOVE_AVE_THREAD 0x3F
#define NORMAL_THREAD 0x7F
#define BELOW_AVE_THREAD 0xBF
#define LOWEST_THREAD 0xFF
#define SLEEPDELAY 1
#define FORLOOPDELAY 2
#define NODELAY 3

LONG APIENTRY MainWndProc (HWND, UINT, UINT, LONG);
VOID ThreadProc (DWORD *ThreadArg);

//--------------------------------------------------------------------
//cpp
//--------------------------------------------------------------------

#include <windows.h>
#include "mltithrd.h"

HANDLE _hInst;
HANDLE _hWnd;
HANDLE _hThread[5];
UINT _uDelayType=NODELAY;

//--------------------------------------------------------------------
// WinMain
//--------------------------------------------------------------------
int APIENTRY WinMain (HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wndclass;

UNREFERENCED_PARAMETER(lpCmdLine);
UNREFERENCED_PARAMETER(hPrevInstance);

_hInst = hInstance;

wndclass.style = 0;
wndclass.lpfnWndProc = (WNDPROC)MainWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (hInstance, "Multi1Icon");
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = "Multi1Menu";
wndclass.lpszClassName = "Multi1Class";

RegisterClass(&wndclass);

_hWnd = CreateWindow ("Multi1Class",
"Thread Priority Example",
WS_OVERLAPPED | WS_SYSMENU,
0, 0, 400, 250,
NULL,
NULL,
hInstance,
NULL);

ShowWindow(_hWnd, nCmdShow);

while (GetMessage (&msg, NULL, 0, 0)) {
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return (msg.wParam);
}
//--------------------------------------------------------------------
// MainWndProc -
//--------------------------------------------------------------------
LONG APIENTRY MainWndProc (HWND hWnd, UINT message,
UINT wParam, LONG lParam)
{
int i;
DWORD ThreadID[5];
static HMENU hMenu;
static HANDLE hMasterThread;
static DWORD ThreadArg[5] = {HIGHEST_THREAD, // 0x00
ABOVE_AVE_THREAD, // 0x3F
NORMAL_THREAD, // 0x7F
BELOW_AVE_THREAD, // 0xBF
LOWEST_THREAD // 0xFF
};

switch (message) {
case WM_CREATE:
hMenu = GetMenu (hWnd);

hMasterThread = GetCurrentThread();
SetThreadPriority(hMasterThread, THREAD_PRIORITY_HIGHEST);

for(i=0; i<5; i++)
_hThread[i] = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadProc,
&ThreadArg[i],
CREATE_SUSPENDED,
&ThreadID[i]);

SetThreadPriority(_hThread[0], THREAD_PRIORITY_HIGHEST);
SetThreadPriority(_hThread[1], THREAD_PRIORITY_ABOVE_NORMAL);
SetThreadPriority(_hThread[2], THREAD_PRIORITY_NORMAL);
SetThreadPriority(_hThread[3], THREAD_PRIORITY_BELOW_NORMAL);
SetThreadPriority(_hThread[4], THREAD_PRIORITY_LOWEST);
return (0);

case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_RESUME:
EnableMenuItem(hMenu, IDM_RESUME, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_SUSPEND, MF_BYCOMMAND | MF_ENABLED);
DrawMenuBar(hWnd);
for (i=0; i<5; i++)
ResumeThread(_hThread[i]);
return (0);

case IDM_SUSPEND:
for (i=0; i<5; i++)
SuspendThread(_hThread[i]);
EnableMenuItem(hMenu, IDM_SUSPEND, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_RESUME, MF_BYCOMMAND | MF_ENABLED);
DrawMenuBar(hWnd);
return (0);

case IDM_FOR:
_uDelayType = FORLOOPDELAY;
EnableMenuItem(hMenu, IDM_FOR, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_SLEEP, MF_BYCOMMAND | MF_ENABLED);
EnableMenuItem(hMenu, IDM_NODELAY, MF_BYCOMMAND | MF_ENABLED);
DrawMenuBar(hWnd);
return (0);

case IDM_SLEEP:
_uDelayType = SLEEPDELAY;
EnableMenuItem(hMenu, IDM_SLEEP, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_FOR, MF_BYCOMMAND | MF_ENABLED);
EnableMenuItem(hMenu, IDM_NODELAY, MF_BYCOMMAND | MF_ENABLED);
DrawMenuBar(hWnd);
return (0);

case IDM_NODELAY:
_uDelayType = NODELAY;
EnableMenuItem(hMenu, IDM_NODELAY, MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, IDM_FOR, MF_BYCOMMAND | MF_ENABLED);
EnableMenuItem(hMenu, IDM_SLEEP, MF_BYCOMMAND | MF_ENABLED);
DrawMenuBar(hWnd);
return (0);

default:
return (0);
}

case WM_DESTROY :
for(i=0; i<5; i++)
TerminateThread(_hThread[i], 0);
PostQuitMessage (0);
return (0);

default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
return (0L);
}
//--------------------------------------------------------------------
// ThreadProc() - セㄒぇ 5  threads ノぇ thread procedure
//--------------------------------------------------------------------
VOID ThreadProc(DWORD *ThreadArg)
{
RECT rect;
HDC hDC;
HANDLE hBrush, hOldBrush;
DWORD dwThreadHits = 0;
char cBuf[80];
int iThreadNo, i;

GetClientRect (_hWnd, &rect);
hDC = GetDC (_hWnd);
hBrush = CreateSolidBrush(RGB(*(ThreadArg), *(ThreadArg), *(ThreadArg))); // 跑て礶肅︹
hOldBrush = SelectObject(hDC, hBrush);

switch (*ThreadArg) {
case HIGHEST_THREAD : iThreadNo = 0; break;
case ABOVE_AVE_THREAD : iThreadNo = 1; break;
case NORMAL_THREAD : iThreadNo = 2; break;
case BELOW_AVE_THREAD : iThreadNo = 3; break;
case LOWEST_THREAD : iThreadNo = 4; break;
}

// 陪ボ thread 腹絏のㄤ纔舦 (priority)
wsprintf(cBuf, "T%d", iThreadNo);
TextOut(hDC, *(ThreadArg), rect.bottom-150, cBuf, lstrlen(cBuf));
wsprintf(cBuf, "P=%d", GetThreadPriority(_hThread[iThreadNo]));
TextOut(hDC, *(ThreadArg), rect.bottom-130, cBuf, lstrlen(cBuf));

do
{
dwThreadHits++; // 璸计竟

// 礶よ thread 秈︽
Rectangle(hDC, *(ThreadArg), rect.bottom-(dwThreadHits/10),
*(ThreadArg)+0x40, rect.bottom);

// ┑筐...
if (_uDelayType == SLEEPDELAY)
Sleep(10);
else if (_uDelayType == FORLOOPDELAY)
for (i=0; i<30000; i++);
else // _uDelayType == NODELAY)
{ }
} while (dwThreadHits < 1000); // ǖ癹 1000 Ω

hBrush = SelectObject(hDC, hOldBrush); // 確礶肅︹
DeleteObject (hBrush);
ReleaseDC (_hWnd, hDC);
}
//------------------------- end of file ------------------------------

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧