社区
进程/线程/DLL
帖子详情
线程级别的问题
CreaTive1911
2003-03-25 03:47:59
这学期开了操作系统的课程, 前些天老师出了一道题,在一DIALOG内用5种级别线程分别控制5进度条, 可我的5进度条就是以一样的速度前进,老师又只会MFC,而我因为现在在学SDK,所以老师也不清楚。。。。。郁闷。。。我CREATETHREAD时线程是挂起状态,设置线程级别后再 ResumeThread 到底是哪里出了错呀。。。
...全文
86
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 ------------------------------
Spring事务隔离
级别
实战:如何用SERIALIZABLE解决多
线程
并发
问题
本文围绕订单系统中多
线程
导致的重复处理
问题
,剖析Spring默认事务隔离
级别
(READ_COMMITTED)在‘先查后改’场景下的局限性;指出synchronized/Lock等应用层锁在分布式及事务边界上的失效原因;重点阐述SERIALIZABLE隔离
级别
通过数据库级串行化保障(范围锁/MVCC冲突检测)根治并发干扰的原理与实践配置;强调其性能代价、死锁风险及适用边界,并对比乐观锁、悲观锁和幂等性等替代方案。
java
线程
优先
级别
_java
线程
优先级
问题
该博客展示了Java中
线程
优先级的设置。通过代码示例,创建多个
线程
并分别设置不同优先级,包括最小优先级、最大优先级和自定义的优先级10,最后启动这些
线程
并输出
线程
名和优先级。
Java
线程
安全和死锁
问题
本文详细介绍了
线程
安全的概念、
线程
安全
级别
及常见
线程
安全类,通过实例探讨了多
线程
中的
线程
安全
问题
,如多窗口卖票
问题
与死锁
问题
,并深入分析了单例模式的
线程
安全
问题
。
Java基础学习---
线程
(二)
博客主要介绍
线程
相关知识,包含
线程
优先
级别
,给出其使用范例,还阐述
线程
同步,介绍synchronized关键字使用范例,提及
线程
死锁
问题
及解决办法,即最好只锁定一个对象,此外还涉及生产者消费者
问题
。
字节码指令
级别
从i++说到volatile,深入理解i++的
线程
安全
问题
本文深入探讨了i++操作在多
线程
环境中的行为,通过字节码级分析揭示了
线程
安全
问题
的本质,并介绍了volatile关键字的作用及其对多
线程
安全性的影响。
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章