社区
Windows SDK/API
帖子详情
如何控制同时只能有一个任务(进程)在运行?
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.实验目的: 通过在Windows
任务
管理器中对
进程
进行相应的...
linux的crontab里面,保证最多
运行
一个
进程
/两个
进程
/多个
进程
的解决方法
在linux的crontab里面,保证最多...flock 会去判断根据
一个
锁文件去判断
进程
有没有在
运行
。如果在
运行
,后面的
进程
就得等待。 flock -s --shared: 获得
一个
共享锁 flock -x --exclusive: 获得
一个
独占锁/排他锁...
进程
池(multiprocess.Pool)
那么在成千上万个
任务
需要被执行的时候,我们就需要去创建成千上万个
进程
么? ????首先,创建
进程
需要消耗时间,销毁
进程
也需要消耗时间。 ????第二即便开启了成千上万的
进程
,操作系统也不能让他们同时执行,这样...
进程
和线程
进程
是系统对应用程序的封装,是系统进行资源调度和分配的基本...1.
一个
线程
只能
属于
一个
进程
,但
一个
进程
可以拥有多个线程,至少有
一个
线程,线程依赖于
进程
存在。 2.
进程
在
运行
过程中拥有独立的内存单元,而多个线程
Windows SDK/API
1,221
社区成员
8,136
社区内容
发帖
与我相关
我的任务
Windows SDK/API
C++ Builder Windows SDK/API
复制链接
扫一扫
分享
社区描述
C++ Builder Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章