Come passare i vettori alle funzioni multithread?



  • Salve a tutti,
    son nuovo del forum e mi sto accingendo ad usare Qt per sviluppare in C++.
    Vi espongo il mio problema:
    Il nostro professore di Informatica ci ha dato come compito di realizzare un'applicazione multi thread e ci ha detto di usare la seguente sintassi QFuture<void>future=QtConcurrent::run(funzione) ; da solo sono riuscito a capire che per passare delle variabili a "funzione" basta scriverli accanto a "funzione" separati da una virgola. Il problema è che io devo passargli un vettore di int e una stringa char.
    Qualcuno di voi saprebbe indicarmi il giusto metodo per passare gli array al thread visto che nel modo in cui ho provato io, Qt mi dice che l'array è usato come inizializzatore (array used as initializer).
    Vi ringrazio.



  • Puoi incollare il codice con cui hai provato?



  • Certamente ecco qua:

    @#include <QtCore/QCoreApplication>
    #include <QFuture>
    #include <iostream>
    #include <fstream>
    #include <QtConcurrentRun>
    #include <cstdlib>
    #include <time.h>
    using namespace std;

    void thread (int vet,char nome)
    {
    fstream output("output.txt", ios::out | ios::app); //apertura in scrittura del file che conterrà i nomi e i numeri random
    srand (time (NULL));
    for (int i=0; i<10;i++)
    {
    vet[i]=rand () % 100;
    }
    output << nome;
    for (int i=0; i<10; i++)
    {
    output << " " <<vet[i];
    }
    output << endl;
    output.close();
    }

    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);
    char nome[20];
    string percorso; //questa stringa serve per acquisire il percorso del file da prendere in input
    int vet[10]; //questo è il vettore che verrà riempito di 5 numeri random

    cout << "Specificare il percorso del file contenente i nomi: ";
    cin >> percorso;
    fstream nomiIn(percorso.c_str(), ios::in); //apertura in lettura del file contenente i nomi
    if (!nomiIn)
    {
        cout << "Il file non puo' essere aperto perche' non e' stato trovato!"<<endl;
    }
    else
    {
        while (nomiIn >> nome)
        {
            QFuture<void>future=QtConcurrent::run(thread, vet, nome);
        }
    }
    
    
    return a.exec(&#41;;
    

    }@

    Il programma dovrebbe leggere dei nomi dal file nomiIn e successivamente creare un thread per ogni nome. Nel thread deve riempire di numeri random il vettore vet e successivamente salvare nel file output il nome preso e accanto i numeri random.
    Spero di essermi spiegato.
    P.S
    è il mio primo tentativo con i thread.



  • Erk... usa i tag '@' per racchiudere il codice, o non si capisce niente :-)



  • [quote author="peppe" date="1294596032"]Erk... usa i tag '@' per racchiudere il codice, o non si capisce niente :-)[/quote]

    ok ora dovrebbe andare meglio :)



  • Ok sono riuscito a far compilare il codice modificando la stringa relativa a Qtconcurrent::run nel seguente modo :
    @
    QFuture<void>future=QtConcurrent::run(thread, &vet[0], &nome[0]);
    @
    il problema che ho ora è che non riesco a sincronizzare i thread in modo che il primo thread usi il vettore di int e scriva sul file poi rilasci il vettore per il secondo thread e scrivi su file e cosi via. Qualcuno saprebbe dirmi come usare QMutex o qualcosa del genere?


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.