Oppure

Loading
16/08/12 20:02
Dany
Ciao a tutti.......vi spiego qualè il problema:
Praticamente sto lavorando ad un programma che per compiere determinate operazioni nel WM_PAINT (o anche ne WM_TIMER) impiega svariati secondi....il problema è che quando impiega un tot numero di secondi (meno di una decina)il programma non risponde e sono costretto a terminarlo tramite taskmanager. Il fatto è che una volta che si blocca lo si può lo stesso fermare per analizzarlo in debug mettendo un BreakPoint nella WM_TIMER e ciò mi insospettisce! in pratica il programma continua a funzionare non da segni.....ecco....credo di essermi spiegato. avete suggerimenti?

S.O. Windows 7 Professional 32 bit
Compilatore/IDE: Sia DevC++ 5 che MSVC++2010Express
Sto utilizzando le API di Win32.

Grazie in anticipo.....:k:
aaa
17/08/12 11:52
XBarboX
Potrei dire una cavolata ma forse eseguendo il codice in un thread separato funziona.
Comunque se ho capito bene la finestra si "congela" ?
aaa
17/08/12 12:02
lorenzo
mostra il codice del WM_PAINT altrimenti non si capisce nulla
aaa
17/08/12 19:38
Dany
Intanto grazie, comunque per XBarboX:
Non ho idea di cosa sia un thread, mi pare di aver letto che permette di svolgere istruzioni in contemporanea???:-?
Per Lorenzo:
Ecco il codice:
case WM_PAINT:
            PAINTSTRUCT ps;
            HDC hdcWindow;
            hdcWindow = BeginPaint(hwnd, &ps); 
            //Questo serve a ridisegnare le varie assonometrie dello spazio 3d se si //preme una freccia direzonale.
            if (rot%3==0)
               DrawGriglia1(hdcWindow);
               
            if (rot%3==1)
               DrawGriglia2(hdcWindow);
               
            if (rot%3==2)
               DrawGriglia3(hdcWindow);
            if (rpn!="")   
			funpress++;
			
		/**************************************************************/
/*Il Programma disegna grafici 3D di funzioni	.*/
              hdcWindow = GetDC(hwnd);
			  for (k=-Mz;k<=Mz+(2*Mz/prec);k=k+2*Mz/prec)
			  {
                  percentuale=int((k+Mz)*100/(2*Mz));
                  SendMessage(pro, PBM_SETPOS, percentuale, 0);
				  for (j=-My;j<=My;j=j+2*My/prec)
				  {
                      for (i=-Mx;i<=Mx;i=i+2*Mx/prec)
                      {
                          result=SolveRPN(rpn,i,j,k);
                          result2=SolveRPN(rpn2,i,j,k);
                          if (fabs(result-result2)<Mx/100)
                          {
                               penna=CreatePen(PS_SOLID,3,RGB(fabs(k*255/Mz),255-fabs(k*255/Mz),fabs(k*255/Mz)));
			                   SelectObject(hdcWindow,penna);
                               if (rot%3==0)
                               /*ADATTAMENTO ALL'ASSONOMETRIA*/
                               {
                                  x=i/2;
                                  y=j/1.4142135-k;
                                  ballX=int(500-x*500/Mx);
                                  ballY=int(500+y*500/My);
                                  pp[1].x=ballX;
							      pp[1].y=ballY;
							      if ((pp[0].x>0)&&(pp[0].y>0)&&(dist(pp[1],pp[0])<350)&&(ckx==BST_CHECKED))
							    	Polyline(hdcWindow,pp ,2);
	    	                      pp[0].x=ballX;
							      pp[0].y=ballY;
							      if (ckx!=BST_CHECKED)
							      {
                                      if (((i<0)||(j<0)||(k<0))||((i<0)&&(j<0)&&(k<0)))
                                      {
                                          SetPixel(hdcWindow,ballX,ballY,RGB(255,0,255));  
                                          SetPixel(hdcWindow,ballX+1,ballY,RGB(255,0,255));
                                          SetPixel(hdcWindow,ballX-1,ballY,RGB(255,0,255));
                                          SetPixel(hdcWindow,ballX,ballY+1,RGB(255,0,255)); 
                                          SetPixel(hdcWindow,ballX,ballY-1,RGB(255,0,255));       
                                      }
                                      if ((i>0)&&(j>0)&&(k>0))
                                      {
                                          SetPixel(hdcWindow,ballX,ballY,RGB(255,0,0));  
                                          SetPixel(hdcWindow,ballX+1,ballY,RGB(255,0,0));
                                          SetPixel(hdcWindow,ballX-1,ballY,RGB(255,0,0));
                                          SetPixel(hdcWindow,ballX,ballY+1,RGB(255,0,0)); 
                                          SetPixel(hdcWindow,ballX,ballY-1,RGB(255,0,0));  
                                      }
                                  }
                               }                         
                               if (rot%3==1)
                               {
                                  x=(i-(j/1.73205))*1.73205/2;
                                  y=(j*2/1.73205)+((i-(j/1.73205))/2)-k;
                                  ballX=int(500-x*500/Mx);
                                  ballY=int(500+y*500/My);
                                  pp[1].x=ballX;
							      pp[1].y=ballY;
							      if ((pp[0].x>0)&&(pp[0].y>0)&&(dist(pp[1],pp[0])<350)&&(ckx==BST_CHECKED))
							    	Polyline(hdcWindow,pp ,2);
	    	                      pp[0].x=ballX;
							      pp[0].y=ballY;
							      if (ckx!=BST_CHECKED)
							      {
                                      if (((i<0)||(j<0)||(k<0))||((i<0)&&(j<0)&&(k<0)))
                                      {
                                          SetPixel(hdcWindow,ballX,ballY,RGB(255,0,255));  
                                          SetPixel(hdcWindow,ballX+1,ballY,RGB(255,0,255));
                                          SetPixel(hdcWindow,ballX-1,ballY,RGB(255,0,255));
                                          SetPixel(hdcWindow,ballX,ballY+1,RGB(255,0,255)); 
                                          SetPixel(hdcWindow,ballX,ballY-1,RGB(255,0,255));       
                                      }
                                      if ((i>0)&&(j>0)&&(k>0))
                                      {
                                          SetPixel(hdcWindow,ballX,ballY,RGB(255,0,0));  
                                          SetPixel(hdcWindow,ballX+1,ballY,RGB(255,0,0));
                                          SetPixel(hdcWindow,ballX-1,ballY,RGB(255,0,0));
                                          SetPixel(hdcWindow,ballX,ballY+1,RGB(255,0,0)); 
                                          SetPixel(hdcWindow,ballX,ballY-1,RGB(255,0,0));  
                                      }
                                  }
                               } 
                               if (rot%3==2)
                               {
                                  x=(i-(j/2))/2;
                                  y=(i-j/2)/(1.73205/2)+(2*j/1.73205)-k;

                                  ballX=int(500-x*500/Mx);
                                  ballY=int(500+y*500/My);
                                  pp[1].x=ballX;
							      pp[1].y=ballY;
							      if ((pp[0].x>0)&&(pp[0].y>0)&&(dist(pp[1],pp[0])<350)&&(ckx==BST_CHECKED))
							    	Polyline(hdcWindow,pp ,2);
	    	                      pp[0].x=ballX;
							      pp[0].y=ballY;
							      if (ckx!=BST_CHECKED)
							      {
                                      if (((i<0)||(j<0)||(k<0))||((i<0)&&(j<0)&&(k<0)))
                                      {
                                          SetPixel(hdcWindow,ballX,ballY,RGB(255,0,255));  
                                          SetPixel(hdcWindow,ballX+1,ballY,RGB(255,0,255));
                                          SetPixel(hdcWindow,ballX-1,ballY,RGB(255,0,255));
                                          SetPixel(hdcWindow,ballX,ballY+1,RGB(255,0,255)); 
                                          SetPixel(hdcWindow,ballX,ballY-1,RGB(255,0,255));       
                                      }
                                      if ((i>0)&&(j>0)&&(k>0))
                                      {
                                          SetPixel(hdcWindow,ballX,ballY,RGB(255,0,0));  
                                          SetPixel(hdcWindow,ballX+1,ballY,RGB(255,0,0));
                                          SetPixel(hdcWindow,ballX-1,ballY,RGB(255,0,0));
                                          SetPixel(hdcWindow,ballX,ballY+1,RGB(255,0,0)); 
                                          SetPixel(hdcWindow,ballX,ballY-1,RGB(255,0,0));  
                                      }
                                  }
                              } 
                          }
                      }
                  }
              }
              pp[0].x=0;
              pp[0].y=0;
              
              funpress=0;
              
            EndPaint(hwnd, &ps);
		 break;
aaa
17/08/12 19:39
Dany
In pratica il problema sta nei tre cicli annidati che in totale si ripetono 343000volte.
MI SCUSO SE IL CODICE è ESTREMAMENTE SCOMMENTATO MA DOVREBBE ESSERE ABBASTANZA INTUITIVO, PER QUALSIASI CHIARIMENTO CHIEDI PURE ;)
Ultima modifica effettuata da Dany 17/08/12 19:41
aaa
17/08/12 19:59
lorenzo
Secondo me dovresti porti 3 domande:

1) ad OGNI repaint della finestra deve essere eseguita tutta quella roba? Non si può ottimizzare in qualche modo? Magari ridisegnando solo la parte invalidata...

2) varrebbe la pena di usare il double buffering? Potrebbe aumentare la velocità di esecuzione.

3) si può usare un thread? Se la GUI principale deve smistare i dati, non può certo essere utilizzata per fare calcoli. Il thread esegue "a parte" tutti i calcoli, passando poi alla GUI il risultato(magari usando il punto 2)

aaa
18/08/12 15:35
Dany
Grazie, ma ora ti spiego:
Il problema non sta nel fatto che WM_PAINT deve ripetersi ogni volta ma sta nel fatto che deve fare tutta quella roba e fa "congelare il programma"....inoltre Potresti spiegarmi gentilmente cosa sia il double buffering? credo venda usato nei programmi tipo MSPaint....mi accontento anche di un link....:k:
aaa
23/08/12 9:02
Dany
Comunque ho risolto, è bastato creare una funzione che corrispondeva alla DoEvents in VB ed eliminare la penna=CreatePen(...); che evidentemente se ripetuta troppe volte in un ciclo portava al blocco dell'applicazione...Grazie lo stesso;)
aaa