Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    [C++] Produttore / Consumatore

    Ciao. Un amico mi ha dato del codice C++ che non funziona... io ho corretto dove possibile, ma, purtroppo, di thread per Windows non ne so proprio niente.
    Infatti il programma gira, ma se provo a visualizzare l'output va subito in errore.
    Premetto che viene compilato con un sacco di Warning. Questo è il codice, se qualcuno riesce a metterci le mani...

    Il problema è quello classico di Produttore/Consumatore. Fosse stato per Linux non ci sarebbero stati problemi, ma con le WINAPI di Windows proprio non ne vengo fuori.
    codice:
    // generatore.cpp : Defines the entry point for the console application.
    //
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <winbase.h>
    #include <time.h>
    #include <string.h>
    #define DIM 10
    HANDLE DP,DV,PP,PV;
    int pari[DIM],dispari[DIM],paripos=0,dispos=0;
    
    CRITICAL_SECTION cs;
    DWORD WINAPI cons(LPVOID nome)
    {
    	printf("sto consumando");
    
    	int k=0;
    	while(1){
    		
    	EnterCriticalSection(&cs);
    	if(!strcmp((char*)nome,"pari"))
    	{
    		//WaitForSingleObject(PP,INFINITE);
    			if (paripos==DIM-1)
    			{
    				for	(k=0;k<DIM;k++)
    					printf("%d ",pari[k]);
    			}
    
    		paripos=0;
    		//ReleaseSemaphore(PV,1,NULL);
    	}
    	else if(!strcmp((char*)nome,"dispari"))
    	{
    		//WaitForSingleObject(DP,INFINITE);
    			if (dispos==DIM-1)
    			{
    				for	(k=0;k<DIM;k++)
    					printf("%d ",dispari[k]);
    			}
    
    		dispos=0;
    		//ReleaseSemaphore(DV,1,NULL);
    	}
    	else
    	{
    		//LeaveCriticalSection(&cs);
    		return -1;
    	}
    	printf(" > ");
    //	LeaveCriticalSection(&cs);
    	return 0;
    	}
    
    }
    DWORD WINAPI prod(LPVOID n)
    {
    	printf("sto producendo");
    	while(1){
    
    	int x;
    	x=rand()%100;
        printf("%d ", x);
    	if (x%2==0)
    	{
    		//WaitForSingleObject(PV,INFINITE);
    		pari[paripos]=x;
    		paripos++;
    	
    	//ReleaseSemaphore(DP,1,NULL);
    	}
    	else
    	{
    		//WaitForSingleObject(DV,INFINITE);
    		dispari[dispos]=x;
    		dispos++;
    		ReleaseSemaphore(DP,1,NULL);
    
    	}
    
    	}
    	return 0;
    }
    int main()
    {
    /*    char *nome1 = "pari";
        char *nome2 = "dispari"; */
    	srand((unsigned)time(NULL));
    	InitializeCriticalSection(&cs);
    	PP=CreateSemaphore(NULL,0,DIM,NULL);
    	PV=CreateSemaphore(NULL,DIM,DIM,NULL);
    	DP=CreateSemaphore(NULL,0,DIM,NULL);
    	DV=CreateSemaphore(NULL,DIM,DIM,NULL);
    	HANDLE t1=CreateThread(NULL,NULL,prod,NULL,NULL,NULL);
    	CreateThread(NULL,NULL,cons,nome1,NULL,NULL);
    	CreateThread(NULL,NULL,cons,nome2,NULL,NULL);
        
    	Sleep(10000);
    	CloseHandle(DP);
    	CloseHandle(DV);
    	CloseHandle(PP);
    	CloseHandle(PV);
    	
    /*	for (int i=0; i<DIM; i++) printf("%d ", pari[i]);
    	printf("\n");
    	for (int i=0; i<DIM; i++) printf("%d ", dispari[i]); */
    
    	return 0;
    }
    Ciao e grazie per le risposte.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  2. #2
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Perchè hai lasciato cetre parti di codice commentate, come
    /* char *nome1 = "pari";
    char *nome2 = "dispari"; */
    ?

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Perchè altrimenti va in errore...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    OK, ma meglio vedere gli errori che compilarlo senza che funzioni!
    Comunque non ci capisco niente lo stesso, ho fatto qualche tentativo

  5. #5
    se mi dai la tua mail ti mando una lib x win32 che è standard POSIX e usa funz == a linux pure su winzoz
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

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 © 2025 vBulletin Solutions, Inc. All rights reserved.