Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    20

    [C] Eseguire più istruzioni contemporaneamente

    Salve a tutti di nuovo, scrivo qui perchè vorrei sapere, non avendo trovato niente per la rete, se è possibile tramite il linguaggio C eseguire più istruzioni contemporaneamente come da titolo.

    Il mio problema è questo
    Ho creato vari programmi per esercitarmi con matrici, puntatori, funzioni e ci ho preso la mano fino ai miei ultimi Pacman e Snake, che funzionano alla perfezione.
    Se non per il fatto che non so come fare in modo che, contemporaneamente, il programma aspetti un input da tastiera, nel mio caso un getch(), e intanto raggiunto un valore di tempo preimpostato, se non è stato trovato nessun input, continui con l'istruzione precedente.
    Esempio: Con un semplice do-while o while non è possibile una struttura del genere perchè in qualunque caso aspetta un input utilizzando un getch() e il programma si ferma finchè non lo trova

    Vorrei invece fare una cosa del genere

    codice:
         char pos;
    do {
         pos=getch();
         if (pos=='w')
         {
             ...
         }
         else if (pos=='s')
         {
              ...
         }
         else if (pos=='a')
         {
              ...
         }
         else if (pos=='d')
         {
              ...
         }
         else { ... }
         /*MODIFICA MATRICE E COORDINATE
         *.............
         */
    } while (/*qui metterei la possibile soluzione per controllare il tempo*/);
    è possibile una soluzione così? se no, mi potreste spiegare come ovviare al problema? grazie

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Se sei su windows, con windows.h te la puoi cavare facilmente con una sleep.
    Ma anche su UNIX ci sono funzioni che fanno al tuo caso.
    Però nel tuo caso non si tratta di eseguire più istruzioni contemporaneamente, non ti serve di creare altri processi paralleli.
    Fammi sapere su che sistema operativo lavori.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    21
    devi usare il multithreading vai qua:http://www.computersciencelab.com/Mu...eadingTut1.htm

    spero di esserti stato di aiuto

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    20
    Originariamente inviato da ramy89
    Se sei su windows, con windows.h te la puoi cavare facilmente con una sleep.
    Ma anche su UNIX ci sono funzioni che fanno al tuo caso.
    Però nel tuo caso non si tratta di eseguire più istruzioni contemporaneamente, non ti serve di creare altri processi paralleli.
    Fammi sapere su che sistema operativo lavori.
    Ciao, grazie della risposta ad entrambi e scusate il ritardo.
    Sono su windows, ma con sleep ho già provato, il problema è che io devo creare due condizioni parallele che chiudano il ciclo, o che comunque ritornino un valore che faccia partire un'istruzione successiva.
    Ovvero, se metto lo sleep prima del pos=getch(); comunque dopo aver aspettato n millisecondi che imposto io, aspetta il getch.. se lo metto dopo, comunque aspetta il getch.
    Se lo metto nella condizione, non funziona, o almeno nel modo in cui la setto io.
    Se hai suggerimenti sono ben accetti, ho scritto qui apposta xD

    Per quello che ho letto sul multithreading invece penso che possa funzionare, ho fatto un paio di prove su programmi banali e il risultato è quello sperato, dovrò rifletterci su per capire bene come funziona e non andare a muzzo

    Comunque sono aperto a suggerimenti sull'uso dello sleep
    Grazie ancora

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Mi ero sbagliato.

  6. #6
    E' un programma su console?

    Mi ricorda i vecchi giochini che facevo in Pascal: anche io avevo il tuo stesso problema che grazie alla libreria crt del Borland avevo risolto (praticamente era una funzione che ritornava TRUE se era stato premuto un tasto, FALSE altrimenti. Capisci già che sarebbe la soluzione al tuo problema).

    HO scoperto che esiste una funzione del tutto simile a quella del Turbo Pascal, fa parte anch'essa di conio.h (quindi non fa parte dello standard C/C++) e si chiama kbhit(),che ritorna un valore diverso da zero se è stato premuto un tasto, zero altrimenti.
    codice:
    char tasto;
    if (kbhit()) 
        tasto = getch();
    //.....
    oppure...credo che khbit() ritorni pure il valore numerico del tasto, potresti fare semplicemnte:
    codice:
    tasto = kbhit();
    //.....
    fammi sapere se ti funziona...

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    20
    eheh perfetto!
    guardandolo un attimo e facendo qualche prova ho notato che effettivamente è possibile!
    ho buttato giù queste quattro righe e danno il risultato sperato!
    grazie mille ora non mi resta che adattarlo ai miei giochini xD
    comunque, si, lavoro in console

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    int main()
    {
        char tasto=0;
        int j=1, i;
        for (i=0; i<500; i++)
        {
            j=1;
            while (!kbhit())
            {
                  sleep(200);
                  j=0;
                  if (j==0)
                     break;
            }
            if (kbhit())
               tasto=getch();
            if (tasto=='a')
                printf("Sinistra\n");
            else if (tasto=='d')
                printf("Destra\n");
            else if (tasto=='s')
                printf("Giu'\n");
            else if (tasto=='w')
                printf("Su\n");
            else if ((tasto!='a')&&(tasto!='d')&&(tasto!='s')&&(tasto!='w')&&(tasto!=0))
                printf("Nessun comando valido!\n");
            else
                printf("Nessun comando!\n");
        }
        system("pause");
        return 0;
    }
    però adesso mi stava prendendo il multithreading, e se possibile vorrei capire dove sta l'errore in questo codice, perchè non riesco a farlo funzionare correttamente

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <conio.h>
    
    void thread1(int *);
    void thread2(int *);
    
    int main()
    {
        int scelta, x=0;
        do {
            x=0;
            _beginthread(thread1, &x);
            _beginthread(thread2, &x);
        } while (x==0);
        system("pause");
        return 0;
    }
    
    void thread1(int *x)
    {
         char pos;
         pos=getch();
         if (pos=='a')
             printf("<--\n");
         else if (pos=='d')
             printf("-->\n");
         (*x)=1;
    }
    
    void thread2(int *x)
    {
         sleep(5000);
         printf("Tempo!\n");
         (*x)=1;
    }
    non capisco perchè il thread non si ferma una volta che assegno x=1..
    e grazie di nuovo!!

  8. #8
    Originariamente inviato da simondin
    codice:
        do {
            x=0; 
            _beginthread(thread1, &x);
            _beginthread(thread2, &x);
        } while (x==0);
    Ad ogni iterazione assegni x = 0...
    Devi attendere all'interno del ciclo altrimenti continui a lanciare thread...

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    20
    l'ho tolta ma comunque i thread non terminano...
    dopo 5 secondi di sleep continua a stampare Tempo!\n per un numero di volte e poi aspetta di nuovo 5 secondi..

  10. #10
    Originariamente inviato da simondin
    l'ho tolta ma comunque i thread non terminano...
    dopo 5 secondi di sleep continua a stampare Tempo!\n per un numero di volte e poi aspetta di nuovo 5 secondi..
    Mi quoto: "Devi attendere all'interno del ciclo altrimenti continui a lanciare thread..."

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.