vc多线程修改同一个全局变量,如何加锁
CRITICAL_SECTION cs; // 全局变量 ::InitializeCriticalSection( & cs); // 初始化锁 ::EnterCriticalSection( & cs); 获得锁 ...... ::LeaveCriticalSection( & cs); // 释放锁 ...... ::DeleteCriticalSection( & cs); // 删除锁
------解决方案--------------------------------------------------------探讨引用:C/C++ codeCRITICAL_SECTION cs; // 全局变量
如何在windows系统上用c++创建多线程
//?TS2.cpp?:?Defines?the?entry?point?for?the?console?application.
//
#include?"stdafx.h"
#include?
#include?
#include?
void?gotoxy(int?a,?int?b)
{
????cout<<"gotoxy関数実行成功!!!"<VC中怎么用多线程画图,不显示画图过程啊,我是新手如果用DC的话,也就是设备内容(CreateCompatibleDC),多线程绘制意义不大。
因为DC的缘故,线程必须要做同步,所以最终的效率不会有多大提升,也就是多一个系统调度时间片而已。
因此,
1、如果在CreateCompatibleDC的情况下必须使用多线程的话,那就是要用系统临界区对全局DC(绘图设备内容)做原子访问限制。
具体可以搜索一下“系统临界区”。
2、如果不一定用何种绘图手段,需要多线程来大幅度提升效率的话,我推荐采用定义全局画布缓冲区,然后对每一个绘图线程分配其各自的Rect,用以绘制,最后用DirectDraw或Direct3D将缓冲区复制到显卡即可。
这样效率是最高的。
例如:
unsigned char g_ucGraphMemory[1024*768*4]; //全局画布缓冲区,1024x768大小,32位色(A8R8G8B8)
typedef struct
{
unsigned char *ptrOffset;
unsigned long dwLength;
} DrawRect; // 每个线程需要画的区域
int main()
{
/* 将整个画布(g_ucGraphMemory)分割成4块区域 */
DrawRect mRect[4];
mRect[0].ptrOffset = g_ucGraphMemory;
mRect[1].ptrOffset = g_ucGraphMemory + (1024 * 768);
mRect[2].ptrOffset = g_ucGraphMemory + ((1024 * 768) * 2);
mRect[3].ptrOffset = g_ucGraphMemory + ((1024 * 768) * 3);
mRect[0].dwLength = 1024 * 768;
mRect[1].dwLength = 1024 * 768;
mRect[2].dwLength = 1024 * 768;
mRect[3].dwLength = 1024 * 768;
/***********************************************/
CreateThread(..., Thread1, &mRect[0]); // 创建绘图线程1
CreateThread(..., Thread2, &mRect[1]); // 创建绘图线程2
CreateThread(..., Thread3, &mRect[2]); // 创建绘图线程3
CreateThread(..., Thread4, &mRect[3]); // 创建绘图线程4
......
WaitForSingleObject(); // 等待线程绘图完毕
Direct3DCreate9(); // 创建D3D设备
....
CreateTexture(); // 创建纹理
....
CreateVertexBuffer(); // 创建顶点缓冲区
....
LockRect(); // 锁定纹理区域
memcpy(); // 把g_ucGraphMemory复制到D3D纹理缓冲区内
....
DrawPrimitive(); // 把纹理贴到多边形上
....
Present(); // 显卡绘图
....
}
// 绘图线程1
DWORD WINAPI Thread1(DrawRect *ptrRect)
{
ptrRect->ptrOffset; // 这个便是此线程需要绘制的区域始地址
ptrRect->dwLength ; // 这个是此线程需要绘制的区域大小
..... // 这里可以使用像素填充法、向量、GDI复制到内存区等手段进行绘制
..... // 通知主线程绘图完毕
}
// 绘图线程2
DWORD WINAPI Thread2(DrawRect *ptrRect)
{
....
}
// 绘图线程3
DWORD WINAPI Thread3(DrawRect *ptrRect)
{
....
}
// 绘图线程4
DWORD WINAPI Thread4(DrawRect *ptrRect)
{
....
}
以上只是一个多线程分块内存缓冲区绘图的流程例子,实际代码要多一些。
此处主要表达分块的思想和主线程等待分线程绘图并进行显示的流程。
其中分块过程是为了简单,所以采用数组直接分段。
实际中需要按照应用场合进行调整,如按行像素分块、按列像素分块、按矩形像素分块等。
vc如何多线程编程
在VC中可以调用MFC函数AfxBeginThread,创建线程。
线程做什么,怎么做就得看你自己的设计了。
贴一段MSDN里的代码:
Visual C++ Copy Code
class CSockThread : public CWinThread
{
public:
SOCKET m_hConnected;
protected:
CChatSocket m_sConnected;
// remainder of class declaration omitted.
Visual C++ Copy Code
BOOL CSockThread::InitInstance()
{
// Attach the socket object to the socket handle
// in the context of this thread.
m_sConnected.Attach(m_hConnected);
m_hConnected = NULL;
return TRUE;
}
Visual C++ Copy Code
// This listening socket has been constructed
// in the primary thread.
void CListeningSocket::ept(int nErrorCode)
{
UNREFERENCED_PARAMETER(nErrorCode);
// This CSocket object is used just temporarily
// to ept the ing connection.
CSocket sConnected;
ept(sConnected);
// Start the other thread.
CSockThread* pSockThread = (CSockThread*)AfxBeginThread(
RUNTIME_CLASS(CSockThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if (NULL != pSockThread)
{
// Detach the newly epted socket and save
// the SOCKET handle in our new thread object.
// After detaching it, it should no longer be
// used in the context of this thread.
pSockThread->m_hConnected = sConnected.Detach();
pSockThread->ResumeThread();
}
}