社区
进程/线程/DLL
帖子详情
线程级别的问题
CreaTive1911
2003-03-25 03:47:59
这学期开了操作系统的课程, 前些天老师出了一道题,在一DIALOG内用5种级别线程分别控制5进度条, 可我的5进度条就是以一样的速度前进,老师又只会MFC,而我因为现在在学SDK,所以老师也不清楚。。。。。郁闷。。。我CREATETHREAD时线程是挂起状态,设置线程级别后再 ResumeThread 到底是哪里出了错呀。。。
...全文
47
2
打赏
收藏
线程级别的问题
这学期开了操作系统的课程, 前些天老师出了一道题,在一DIALOG内用5种级别线程分别控制5进度条, 可我的5进度条就是以一样的速度前进,老师又只会MFC,而我因为现在在学SDK,所以老师也不清楚。。。。。郁闷。。。我CREATETHREAD时线程是挂起状态,设置线程级别后再 ResumeThread 到底是哪里出了错呀。。。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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 ------------------------------
3-04多
线程
相关
多
线程
是指一个进程(执行中的程序)同时运行多个
线程
(进程中负责程序执行的执行单元),多
线程
可以协作完成进程工作,其目的是更好的利用 CPU 资源 Java
线程
具有五中基本状态 新建状态(New):当
线程
对象对创建...
线程
的优先
级别
线程
线程
安全的
级别
不可变的对象一定是
线程
安全的,并且永远也不需要额外的同步。 Java类库中大多数基本数值类如Integer、String和BigInteger都是不可变的。 无条件的
线程
安全 由类的规格说明所规定的约束在对象被多个
线程
访问时...
4种解决
线程
安全
问题
的方式
线程
安全
问题
,在做高并发的系统的时候,是程序员经常需要考虑的地方。怎么有效的防止
线程
安全
问题
,保证数据的准确性?怎么合理的最大化的利用系统资源等,这些
问题
都需要充分的理解并运行
线程
。当然关于多
线程
的...
线程
安全
问题
的产生条件、解决方式
线程
安全
问题
的产生条件、解决方式
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章