我希望将进程添加到动态列表,然后使用“先到先得”调度算法来调度这些进程。调度算法最多只能同时运行5个进程,并且当一个进程终止时,它应该发出一个信号来指示终止。
然后,当一个进程终止时,一旦队列中有进程,则应使用调度算法调度另一个进程。
也请注意,每个进程都可以访问一个整数共享列表,一次只能一个进程访问。我已经知道如何通过使用QMutex锁定共享整数列表来做到这一点。理想情况下,我正在寻求一个示例,以便可以理解。
//mutex example
QMutex mutex
while(!mutex->tryLock()){
//enter code here
}
this->performTask(); //
mutex.unlock();
您将有5个扩展了QThread的类的实例。每个类都将执行一个QProcess并等待其结束。
class MyThread : public QThread
{
public:
MyThread(MyScheduler& aScheduler)
: iScheduler(aScheduler)
{
}
void ExecuteProgram(const QString& aProgramName)
{
iProgramName = aProgramName;
start();
}
void run()
{
iProcess.start(iProgramName);
iProcess.waitForFinished(-1);
iScheduler.SignalProgramTerminated(this);
}
private:
MyScheduler& iScheduler; // This is your FCFS scheduler.
QString iProgramName;
QProcess iProcess;
};
((我尚未编译此文件,但应该会给您一些进展)。
您可以使用QThreadPool创建一个由5个线程组成的池,这些线程运行您的进程,并使用QQueue以FIFO方式将挂起的进程排队。
编辑:关于互斥锁:互斥锁保护由多个线程执行的一段代码形式的信息。锁定互斥锁的线程将被阻塞,直到没有其他线程持有该锁为止。使用互斥锁的最简单方法是使用QMutexLocker。
void myclass::modifyList(IntegerList* list)
{
QMutexLocker lock(list->getMutex()); //this will block if an other thread holds the mutes
//do stuff
}