社区
进程/线程/DLL
帖子详情
线程级别的问题
CreaTive1911
2003-03-25 03:47:59
这学期开了操作系统的课程, 前些天老师出了一道题,在一DIALOG内用5种级别线程分别控制5进度条, 可我的5进度条就是以一样的速度前进,老师又只会MFC,而我因为现在在学SDK,所以老师也不清楚。。。。。郁闷。。。我CREATETHREAD时线程是挂起状态,设置线程级别后再 ResumeThread 到底是哪里出了错呀。。。
...全文
43
2
打赏
收藏
线程级别的问题
这学期开了操作系统的课程, 前些天老师出了一道题,在一DIALOG内用5种级别线程分别控制5进度条, 可我的5进度条就是以一样的速度前进,老师又只会MFC,而我因为现在在学SDK,所以老师也不清楚。。。。。郁闷。。。我CREATETHREAD时线程是挂起状态,设置线程级别后再 ResumeThread 到底是哪里出了错呀。。。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 ------------------------------
C++系列第2:C++2.0(11+14+17+20)详解及多
线程
实战
(5) 驱动
级别
(如果有兴趣,可以深入到驱动级:包括Windows、Linux) (6) 最好学习点Java+Html+javascript等WEB技术。 2.音视频流媒体专业方向 (1) 音视频流媒体基础理论: 必须认真学会,...
spring
线程
安全
问题
一直有个疑惑,spring是怎么处理自己的
线程
安全
问题
的呢,这里简单说明下。 1、介绍两个概念 有状态的bean:对象中有实例变量(成员变量),可以保存数据,是非
线程
安全的。 无状态的bean:对象中没有实例变量...
3-04多
线程
相关
多
线程
是指一个进程(执行中的程序)同时运行多个
线程
(进程中负责程序执行的执行单元),多
线程
可以协作完成进程工作,其目的是更好的利用 CPU 资源 Java
线程
具有五中基本状态 新建状态(New):当
线程
对象对创建...
线程
的优先
级别
线程
线程
安全的
级别
不可变的对象一定是
线程
安全的,并且永远也不需要额外的同步。 Java类库中大多数基本数值类如Integer、String和BigInteger都是不可变的。 无条件的
线程
安全 由类的规格说明所规定的约束在对象被多个
线程
访问时...
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章