如何控制同时只能有一个任务(进程)在运行?

drageon77 2004-03-14 10:34:23
现在要求一个程序在同一时刻只能有一个例程在运行,如何实现?
...全文
54 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunuo2010000 2004-03-24
  • 打赏
  • 举报
回复
学习
yjy1001 2004-03-20
  • 打赏
  • 举报
回复
楼上转贴得够全了

上面的方法中,以建立“内存文件映射”最安全,可以说绝对不会出错

其次是利用"互斥器(Mutex)",一般情况下不会出问题

其他几种都是在结束任务后,无法再启动程序 …… 或是其他错误。

类库 2004-03-18
  • 打赏
  • 举报
回复
程序只运行一个实例的多种做法

//互斥(Mutex)的用法
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HANDLE hMutexHandle = NULL ;
hMutexHandle =OpenMutex(0,false,"myAPP");

if ( hMutexHandle == NULL )
{
hMutexHandle = CreateMutex(NULL,true,"myAPP");
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
else
{
Application->MessageBox("Application Already Run!","Warnning", MB_OK|MB_ICONWARNING);
}

if ( hMutexHandle )
{
ReleaseMutex(hMutexHandle);
CloseHandle(hMutexHandle);
}
return 0;
}

//原子(ATOM)的用法

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
ATOM nAtom=GlobalFindAtom("myAPP");
if( nAtom ==0 )
{
GlobalAddAtom("myAPP");
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
else
MessageBoxA(Application->Handle,"Alread Run!","Error",MB_OK);

if ( nAtom > 0 )
GlobalDeleteAtom(nAtom);
return 0;
}

//信号灯(Semaphore)的用法

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HANDLE hSemaphoreHandle = NULL ;
long nMaximumCount = 1 ;
hSemaphoreHandle = OpenSemaphore(SEMAPHORE_ALL_ACCESS,false,"myAPP");
if( hSemaphoreHandle == NULL )
{
hSemaphoreHandle = CreateSemaphore(NULL,1,nMaximumCount,"myAPP" );
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
else
MessageBoxA(Application->Handle,"Alread Run!","Error",MB_OK);

if ( hSemaphoreHandle )
{
ReleaseSemaphore(hSemaphoreHandle,1,&nMaximumCount);
CloseHandle(hSemaphoreHandle);
}
return 0;
}

//内存映射文件
class TSharedMem
{
private:
bool FCreated;
BYTE *FFileView;
HANDLE FHandle;
public:
TSharedMem(const char* Name, int Size);
~TSharedMem();

__property BYTE* Buffer = {read=FFileView};
__property bool Created = {read=FCreated};
};
TSharedMem::TSharedMem(const char* Name, int Size)
{
FHandle = CreateFileMapping((HANDLE)0xFFFFFFFF,
NULL, PAGE_READWRITE, 0, Size, Name);
if (FHandle != NULL) {
FCreated = GetLastError() == 0;
FFileView = (BYTE*)MapViewOfFile(FHandle,
FILE_MAP_WRITE, 0, 0, Size);
if (FFileView && FCreated)
ZeroMemory(FFileView, Size);
}
else
FFileView = NULL;
}
TSharedMem::~TSharedMem()
{
if (FFileView) UnmapViewOfFile(FFileView);
if (FHandle) CloseHandle(FHandle);
}
你可以直接使用这个class,来达到让程序只运行一个实例。方法如下:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
TSharedMem SharedMem("我的程序名", 8);
if (!SharedMem.Created) return 0;
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
xjq2003 2004-03-15
  • 打赏
  • 举报
回复
用取互斥量就可以了。
HANDLE Mutex;
Mutex = OpenMutex(MUTEX_ALL_ACCESS,
false,"OneInstanceAllowed"); //取互斥量
if(Mutex == NULL) { //没有重复运行
Mutex = CreateMutex(NULL,true,"OneInstanceAllowed");
}
else { //重复运行了
... //你自己的处理代码
return;
}
yaveymao 2004-03-14
  • 打赏
  • 举报
回复
抱歉
this->Mutex前面的this->不要,复制的时候没看清楚:)
yaveymao 2004-03-14
  • 打赏
  • 举报
回复
用取互斥量就可以了。
HANDLE Mutex;
this->Mutex = OpenMutex(MUTEX_ALL_ACCESS,
false,"OneInstanceAllowed"); //取互斥量
if(this->Mutex == NULL) { //没有重复运行
this->Mutex = CreateMutex(NULL,true,"OneInstanceAllowed");
}
else { //重复运行了
... //你自己的处理代码
return;
}

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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