0

プロセスを動的リストに追加してから、「先着順」スケジューリングアルゴリズムを使用してそれらのプロセスをスケジュールしたいと思います。スケジューリングアルゴリズムは、最大5つのプロセスのみを同時に実行する必要があり、プロセスが終了したときに、終了を示すシグナルを発行する必要があります。

次に、プロセスが終了したら、キューにプロセスがあれば、スケジューリングアルゴリズムによって別のプロセスをスケジュールする必要があります。

また、各プロセスは、一度に1つのプロセスのみがアクセスできる整数の共有リストにアクセスできることにも注意してください。QMutexを使用して共有整数リストをロックすることにより、この部分を実行する方法をすでに知っています。理想的には、私はそれを理解できるように例を探しています。

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

2 に答える 2

0

QThreadを拡張するクラスのインスタンスが5つあります。各クラスは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 に答える
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 に答える