0

我希望将进程添加到动态列表中,然后使用“先到先得”调度算法来调度这些进程。调度算法最多只能同时运行 5 个进程,当一个进程终止时,它应该发出一个信号来指示终止。

然后当一个进程终止时,一旦队列中有进程,调度算法应该调度另一个进程。

另请注意,每个进程都可以访问一个共享整数列表,一次只能访问一个进程。我已经知道如何通过使用 QMutex 锁定共享整数列表来完成这一部分。理想情况下,我正在寻找一个例子,所以我可以理解它。

//mutex example
QMutex mutex
while(!mutex->tryLock()){
    //enter code here
}
this->performTask(); // 
mutex.unlock();
4

2 回答 2

0

您可以使用 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
}
于 2012-11-06T08:18:20.960 回答
0

您将有 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;
};

(我还没有编译这个,但它应该会给你一些进展)。

于 2012-11-06T01:43:43.630 回答