Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Multithreading
Forum - Pascal - Multithreading

Avatar
giosch (Normal User)
Rookie


Messaggi: 23
Iscritto: 16/03/2011

Segnala al moderatore
Postato alle 19:04
Mercoledì, 29/02/2012
Chiedo umilmente scusa, ma mi sono accorto solo ora di aver creato per l'ennesima volta una domanda e non una discussione, quindi vi prego di chiudere o cancellare la precedente discussione, grazie
Testo quotato

Ho letto e studiato la wiki sul sito di freepascal e anche altre, compreso in delphi per vedere se riuscivo a risolvere ma niente...
il mio scopo è far eseguire 3 oggetti in parallelo, che nel mio caso sarebbero dei banalissimi scarafaggi in graph che hanno una procedura del tipo insetto.cammina (iniziox,inizioy,finex,finey,colore);
da quello che avevo capito, Tthread era un oggetto, che andava messo come padre al mio Unthread=object(Tthread) e che usando create e execute li facevo andare...
non ci riesco, penso di sbagliare qualcosa nel ragionamento ma mi dice che non trova tthread e se metto ad esempio uses Classes mi dice che devo mettere un identifier....
molto più semplicemente, senza passare per i miei e(o)rrori  qualcuno mi spiegherebbe o mi passerebbe un programma anche banale che faccia uso del multithread in pascal e che funzioni in windows 7 usando lazarus ?
o se ci riuscite aiutatemi con i miei errori.....



allora, vi posto un mio tentativo riferito a http://wiki.freepascal.org/Multithreaded_Application_Tutorial questa wiki.

sono due unit, una Insetti con l'oggetto insettogenerico e i relativi metodi, una unitThread quasi copiata dal sito e il prog principale che le unisce e usa:

unit insetti
Codice sorgente - presumibilmente Delphi

  1. unit insetti;
  2. interface
  3. uses crt,graph;
  4. type
  5.     insettogenerico=object
  6.           nome:string[25];
  7.           colore:shortint;
  8.           posX,posY:integer;
  9.           constructor prepara;
  10.           procedure posiziona(x,y:integer);
  11.           procedure disegna(coloredisegno:shortint);virtual;
  12.           procedure disegna2(coloredisegno:shortint);virtual;
  13.           procedure cammina(inizioX,inizioY,fineX,fineY:integer;
  14.                              coloredisegno:shortint);
  15.   end;
  16. procedure corpoinsetto(x,y:integer; coloredisegno:shortint);
  17. procedure zampeinsetto(x,y:integer; coloredisegno:shortint);
  18. procedure zampemovimento(x,y:integer; coloredisegno:shortint);
  19.  
  20. implementation
  21.  
  22. procedure corpoinsetto(x,y:integer; coloredisegno:shortint);
  23. begin
  24.       (*antenne*)
  25.       putpixel(x+11,y+0,coloredisegno);
  26.       putpixel(x+21,y+0,coloredisegno);
  27.       putpixel(x+12,y+1,coloredisegno);
  28.       putpixel(x+20,y+1,coloredisegno);
  29.       putpixel(x+13,y+2,coloredisegno);
  30.       putpixel(x+19,y+2,coloredisegno);
  31.       putpixel(x+14,y+3,coloredisegno);
  32.       putpixel(x+18,y+3,coloredisegno);
  33.       putpixel(x+15,y+4,coloredisegno);
  34.       putpixel(x+17,y+4,coloredisegno);
  35.       (*testa*)
  36.       putpixel(x+15,y+4,coloredisegno);
  37.       putpixel(x+16,y+4,coloredisegno);
  38.       putpixel(x+14,y+5,coloredisegno);
  39.       putpixel(x+14,y+6,coloredisegno);
  40.       putpixel(x+17,y+5,coloredisegno);
  41.       putpixel(x+17,y+6,coloredisegno);
  42.       putpixel(x+15,y+7,coloredisegno);
  43.       putpixel(x+16,y+7,coloredisegno);
  44.       (*torace*)
  45.       putpixel (x+14,y+8,coloredisegno);
  46.       putpixel (x+13,y+9,coloredisegno);
  47.       putpixel (x+12,y+10,coloredisegno);
  48.       putpixel (x+12,y+11,coloredisegno);
  49.       putpixel (x+12,y+12,coloredisegno);
  50.       putpixel (x+13,y+13,coloredisegno);
  51.       putpixel (x+14,y+13,coloredisegno);
  52.       putpixel (x+15,y+13,coloredisegno);
  53.       putpixel (x+16,y+13,coloredisegno);
  54.       putpixel (x+17,y+13,coloredisegno);
  55.       putpixel (x+18,y+13,coloredisegno);
  56.       putpixel (x+19,y+10,coloredisegno);
  57.       putpixel (x+19,y+11,coloredisegno);
  58.       putpixel (x+19,y+12,coloredisegno);
  59.       putpixel (x+18,y+9,coloredisegno);
  60.       putpixel (x+17,y+8,coloredisegno);
  61.       (*addome*)
  62.       putpixel (x+15,y+14,coloredisegno);
  63.       putpixel (x+16,y+14,coloredisegno);
  64.       putpixel (x+13,y+15,coloredisegno);
  65.       putpixel (x+14,y+15,coloredisegno);
  66.       putpixel (x+17,y+15,coloredisegno);
  67.       putpixel (x+18,y+15,coloredisegno);
  68.       putpixel (x+12,y+16,coloredisegno);
  69.       putpixel (x+12,y+17,coloredisegno);
  70.       putpixel (x+12,y+18,coloredisegno);
  71.       putpixel (x+12,y+19,coloredisegno);
  72.       putpixel (x+12,y+20,coloredisegno);
  73.       putpixel (x+12,y+21,coloredisegno);
  74.       putpixel (x+12,y+22,coloredisegno);
  75.       putpixel (x+12,y+23,coloredisegno);
  76.       putpixel (x+12,y+24,coloredisegno);
  77.       putpixel (x+19,y+16,coloredisegno);
  78.       putpixel (x+19,y+17,coloredisegno);
  79.       putpixel (x+19,y+18,coloredisegno);
  80.       putpixel (x+19,y+19,coloredisegno);
  81.       putpixel (x+19,y+20,coloredisegno);
  82.       putpixel (x+19,y+21,coloredisegno);
  83.       putpixel (x+19,y+22,coloredisegno);
  84.       putpixel (x+19,y+23,coloredisegno);
  85.       putpixel (x+19,y+24,coloredisegno);
  86.       putpixel (x+13,y+25,coloredisegno);
  87.       putpixel (x+14,y+26,coloredisegno);
  88.       putpixel (x+15,y+27,coloredisegno);
  89.       putpixel (x+16,y+27,coloredisegno);
  90.       putpixel (x+17,y+26,coloredisegno);
  91.       putpixel (x+18,y+25,coloredisegno);
  92. end;
  93.  
  94. procedure zampeinsetto(x,y:integer; coloredisegno:shortint);
  95. begin
  96.       (*zampa anteriore sx*)
  97.       putpixel (x+6,y+2,coloredisegno);
  98.       putpixel (x+7,y+3,coloredisegno);
  99.       putpixel (x+8,y+4,coloredisegno);
  100.       putpixel (x+9,y+5,coloredisegno);
  101.       putpixel (x+10,y+6,coloredisegno);
  102.       putpixel (x+11,y+7,coloredisegno);
  103.       putpixel (x+12,y+8,coloredisegno);
  104.       (*zampa centrale sx*)
  105.       putpixel (x+6,y+10,coloredisegno);
  106.       putpixel (x+7,y+10,coloredisegno);
  107.       putpixel (x+8,y+10,coloredisegno);
  108.       putpixel (x+9,y+10,coloredisegno);
  109.       putpixel (x+10,y+10,coloredisegno);
  110.       putpixel (x+11,y+10,coloredisegno);
  111.       (*zampa posteriore sx*)
  112.       putpixel (x+6,y+18,coloredisegno);
  113.       putpixel (x+7,y+17,coloredisegno);
  114.       putpixel (x+8,y+16,coloredisegno);
  115.       putpixel (x+9,y+15,coloredisegno);
  116.       putpixel (x+10,y+14,coloredisegno);
  117.       putpixel (x+11,y+13,coloredisegno);
  118.       (*zampa anteriore dx*)
  119.       putpixel (x+25,y+2,coloredisegno);
  120.       putpixel (x+24,y+3,coloredisegno);
  121.       putpixel (x+23,y+4,coloredisegno);
  122.       putpixel (x+22,y+5,coloredisegno);
  123.       putpixel (x+21,y+6,coloredisegno);
  124.       putpixel (x+20,y+7,coloredisegno);
  125.       putpixel (x+19,y+8,coloredisegno);
  126.       (*zampa centrale dx*)
  127.       putpixel(x+20,y+10,coloredisegno);
  128.       putpixel(x+21,y+10,coloredisegno);
  129.       putpixel(x+22,y+10,coloredisegno);
  130.       putpixel(x+23,y+10,coloredisegno);
  131.       putpixel(x+24,y+10,coloredisegno);
  132.       putpixel(x+25,y+10,coloredisegno);
  133.       (*zampa posteriore dx*)
  134.       putpixel(x+20,y+13,coloredisegno);
  135.       putpixel(x+21,y+14,coloredisegno);
  136.       putpixel(x+22,y+15,coloredisegno);
  137.       putpixel(x+23,y+16,coloredisegno);
  138.       putpixel(x+24,y+17,coloredisegno);
  139.       putpixel(x+25,y+18,coloredisegno);
  140. end;
  141.  
  142. procedure zampemovimento(x,y:integer; coloredisegno:shortint);
  143. begin
  144.       (*zampa anteriore sx*)
  145.       putpixel (x+10,y+2,coloredisegno);
  146.       putpixel (x+10,y+3,coloredisegno);
  147.       putpixel (x+10,y+4,coloredisegno);
  148.       putpixel (x+10,y+5,coloredisegno);
  149.       putpixel (x+10,y+6,coloredisegno);
  150.       putpixel (x+11,y+7,coloredisegno);
  151.       putpixel (x+12,y+8,coloredisegno);
  152.       (*zampa centrale sx*)
  153.       putpixel (x+6,y+14,coloredisegno);
  154.       putpixel (x+7,y+13,coloredisegno);
  155.       putpixel (x+8,y+12,coloredisegno);
  156.       putpixel (x+9,y+11,coloredisegno);
  157.       putpixel (x+10,y+10,coloredisegno);
  158.       putpixel (x+11,y+10,coloredisegno);
  159.       (*zampa posteriore sx*)
  160.       putpixel (x+9,y+19,coloredisegno);
  161.       putpixel (x+9,y+18,coloredisegno);
  162.       putpixel (x+9,y+17,coloredisegno);
  163.       putpixel (x+9,y+16,coloredisegno);
  164.       putpixel (x+9,y+15,coloredisegno);
  165.       putpixel (x+10,y+14,coloredisegno);
  166.       putpixel (x+11,y+13,coloredisegno);
  167.       (*zampa anteriore dx*)
  168.       putpixel (x+21,y+2,coloredisegno);
  169.       putpixel (x+21,y+3,coloredisegno);
  170.       putpixel (x+21,y+4,coloredisegno);
  171.       putpixel (x+21,y+5,coloredisegno);
  172.       putpixel (x+21,y+6,coloredisegno);
  173.       putpixel (x+20,y+7,coloredisegno);
  174.       putpixel (x+19,y+8,coloredisegno);
  175.       (*zampa centrale dx*)
  176.       putpixel (x+20,y+10,coloredisegno);
  177.       putpixel (x+21,y+10,coloredisegno);
  178.       putpixel (x+22,y+11,coloredisegno);
  179.       putpixel (x+23,y+12,coloredisegno);
  180.       putpixel (x+24,y+13,coloredisegno);
  181.       putpixel (x+25,y+14,coloredisegno);
  182.       (*zampa posteriore dx*)
  183.       putpixel (x+20,y+13,coloredisegno);
  184.       putpixel (x+21,y+14,coloredisegno);
  185.       putpixel (x+22,y+15,coloredisegno);
  186.       putpixel (x+22,y+16,coloredisegno);
  187.       putpixel (x+22,y+17,coloredisegno);
  188.       putpixel (x+22,y+18,coloredisegno);
  189. end;
  190.  
  191. constructor insettogenerico.prepara;
  192. var
  193.    grdriver:smallint;
  194.    grmode:smallint;
  195.    errcode:integer;
  196. begin
  197.      grdriver:=detect;
  198.      initgraph(grdriver,grmode,'');
  199.      errcode:=graphresult;
  200.      if errcode=grOk then
  201.      else
  202.          writeln('Impossibile passare alla modalità gragica');
  203. end;
  204.  
  205. procedure insettogenerico.posiziona(x,y:integer);
  206. begin
  207.      posX:=x;
  208.      posY:=y;
  209. end;
  210.  
  211. procedure insettogenerico.disegna(coloredisegno:shortint);
  212. var
  213.    x,y:integer;
  214. begin
  215.      x:=posX;
  216.      y:=posY;
  217.      colore:=coloredisegno;
  218.      corpoinsetto(x,y,coloredisegno);
  219.      zampeinsetto(x,y,coloredisegno);
  220. end;
  221.  
  222. procedure insettogenerico.disegna2(coloredisegno:shortint);
  223. var
  224.    x,y:integer;
  225. begin
  226.      x:=posx;
  227.      y:=posy;
  228.      colore:=coloredisegno;
  229.      corpoinsetto(x,y,coloredisegno);
  230.      zampemovimento(x,y,coloredisegno);
  231. end;
  232.  
  233.  
  234. procedure insettogenerico.cammina(inizioX,inizioY,fineX,fineY:integer;coloredisegno:shortint);
  235. var
  236.    coloreinsetto:shortint;
  237.    coloresfondo: shortint;
  238.    stepx, stepy, x, y: integer;
  239. begin
  240.      x := iniziox;
  241.      y := inizioy;
  242.      stepx := round ((finex-iniziox)/50);
  243.      stepy := round ((finey-inizioy)/50);
  244.      coloresfondo := getbkcolor;
  245.      posiziona (x, y);
  246.      repeat
  247.            x := x + stepx;
  248.            y := y + stepy;
  249.            disegna2 (coloresfondo);
  250.            posiziona (x, y);
  251.            disegna (coloreinsetto);
  252.            delay (200);
  253.            disegna (coloresfondo);
  254.            posiziona (x,y);
  255.            disegna2 (coloreinsetto);
  256.            delay (200);
  257.      until (x > finex) or (y < finey);
  258. end;
  259. end.



unit unitThread
Codice sorgente - presumibilmente Delphi

  1. unit unitthread;
  2. interface
  3. uses
  4. {$ifdef unix}
  5.   cthreads,
  6.   cmem, // the c memory manager is on some systems much faster for multi-threading
  7. {$endif}
  8. crt;
  9. Type
  10.     TMyThread = class(TThread)
  11.     private
  12.     protected
  13.       procedure Execute; virtual;
  14.     public
  15.       Constructor Create(CreateSuspended : boolean);
  16.     end;
  17. implementation
  18. constructor TMyThread.Create(CreateSuspended : boolean);
  19. begin
  20.     FreeOnTerminate := True;
  21.     inherited Create(CreateSuspended);
  22. end;
  23.  
  24. procedure TMyThread.Execute;
  25. begin
  26.  
  27. end;



e il programma:
Codice sorgente - presumibilmente Delphi

  1. program insetti_con_thread;
  2. uses
  3.      {$ifdef unix}
  4.      cthreads,
  5.      cmem, // the c memory manager is on some systems much faster for multi-threading
  6.      {$endif}
  7.      crt,
  8.      graph,
  9.      insetti,
  10.      unitthread;
  11.  
  12.  
  13. var ins1,ins2:insettogenerico;
  14.     thread1,thread2:TMyThread;
  15.  
  16. procedure thread1.Execute;
  17. begin
  18.      ins1.cammina(100,400,100,100,15);  //sposta da 100 400 a 100 100 con colore 15
  19. end;
  20.  
  21. procedure thread2.Execute;
  22. begin
  23.      ins2.cammina(300,400,300,100,15);
  24. end;
  25.  
  26. begin
  27.     thread1:= TMyThread.Create(True);
  28.     thread2:= TMyThread.Create(True);
  29.     Thread1.Resume;
  30.     Thread2.Resume;
  31.     readln;
  32. end.



gli errori sono i seguenti:
unitthread.pas(10,30) Error: Identifier not found "TThread"
unitthread.pas(10,30) Error: class type expected, but got "<erroneous type>"
unitthread.pas(17,1) Fatal: There were 2 errors compiling module, stopping


ps, era meglio se potevo usare gli spoiler =), ma non li ho trovati...:-|

Ultima modifica effettuata da Phi il 04/03/2012 alle 20:19
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 19:34
Mercoledì, 29/02/2012
Ciao!
Qual' è lo scopo del programma?
Vuoi simulare il movimento degli insetti sul video?

PM Quote
Avatar
giosch (Normal User)
Rookie


Messaggi: 23
Iscritto: 16/03/2011

Segnala al moderatore
Postato alle 21:06
Mercoledì, 29/02/2012
si, banalmente disegna uno scarafaggio in due pose alternate per fare in modo che sembrino in movimento. L'oggetto insetto funziona, é "collaudato", ma non riesco a far funzionare i thread per farli camminare contemporaneamente
Ps mi sn accorto che nn ho chiamato i constructor, ma sono sbagliati cmnque, dmn li posto giusti, ma gli errori non centrano con quello.

Ultima modifica effettuata da giosch il 29/02/2012 alle 21:09
PM Quote
Avatar
giosch (Normal User)
Rookie


Messaggi: 23
Iscritto: 16/03/2011

Segnala al moderatore
Postato alle 16:43
Giovedì, 01/03/2012
Ho provato a risolvere, aggiungendo classes alle unit e correggendo alcuni errori...ho semplificato lo scopo per ora e ho fatto disegnare due colonne a diverse velocità è va!!! a parte qualche difetto, ma credo sia legato a graph...

programma
Codice sorgente - presumibilmente Delphi

  1. program insetti_con_thread;
  2. uses
  3.      crt,
  4.      graph,
  5.      unitthread;
  6.  
  7. procedure grafica;
  8. var
  9.    grdriver:smallint;
  10.    grmode,driver,mode:smallint;
  11.    errcode:integer;
  12.  
  13.  
  14. begin
  15.       grdriver:=detect;
  16.      initgraph(grdriver,grmode,'');
  17.      errcode:=graphresult;
  18.      if errcode=grOk then
  19.      else
  20.          writeln('Impossibile passare alla modalità grafica');
  21. end;
  22.  
  23.  
  24.  
  25. begin
  26.     grafica;
  27.     tmythread1.Create(false);
  28.     tmythread2.Create(false);
  29.     readln;
  30. end.



unit
Codice sorgente - presumibilmente Delphi

  1. unit unitthread;
  2. interface
  3. uses
  4. {$ifdef unix}
  5.   cthreads,
  6.   cmem, // the c memory manager is on some systems much faster for multi-threading
  7. {$endif}
  8. classes,
  9. crt,
  10. graph;
  11. Type
  12.     TMyThread1 = class(TThread)
  13.     private
  14.     protected
  15.       procedure Execute; override;
  16.     public
  17.       Constructor Create(CreateSuspended : boolean);
  18.     end;
  19.     TMyThread2 = class(TThread)
  20.     private
  21.     protected
  22.       procedure Execute; override;
  23.     public
  24.       Constructor Create(CreateSuspended : boolean);
  25.     end;
  26.  
  27. implementation
  28. constructor TMyThread1.Create(CreateSuspended : boolean);
  29. begin
  30.     FreeOnTerminate := True;
  31.     inherited Create(CreateSuspended);
  32. end;
  33.  
  34. procedure TMyThread1.Execute;
  35. var x:integer;
  36. begin
  37.      for x:=700 downto 200 do
  38.      begin
  39.           delay(50);
  40.           moveto(300,x);
  41.           lineto(200,x);
  42.      end;
  43. end;
  44.  
  45. constructor TMyThread2.Create(CreateSuspended : boolean);
  46. begin
  47.     FreeOnTerminate := True;
  48.     inherited Create(CreateSuspended);
  49. end;
  50.  
  51. procedure TMyThread2.Execute;
  52. var y:integer;
  53. begin
  54.      for y:=700 downto 200 do
  55.      begin
  56.           delay(20);
  57.           moveto(600,y);
  58.           lineto(500,y);
  59.      end;
  60. end;
  61.  
  62. end.



ora però ho un problemuccio :-|, non capisco nemmeno io quello che ho scritto :rofl:...ma non perchè è complicato, a nche perchè mi pare lineare, ma perchè non ho capito che cos'è TThread=class ?? cos'è class? in cosa si differenzia da object, come si usa, che regole segue? non riesco a trovare documentazione a riguardo...
grazie :)

PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 20:31
Domenica, 04/03/2012
Ho cambiato il nome del topic ed eliminato la discussione sbagliata.

Per capire che vuol dire class(TThread) ti posto la definizione di ereditarietà: E' la possibilità per un oggetto di acquisire le caratteristiche (attributi e funzioni membro) di un altro oggetto.
Praticamente, dichiarando Type TMyThread1 = class(TThread) ... tu includei nel TMyThread1 le caratteristiche(funzioni, variabili ... ) del tipo TThread.

Volevi capire questo ? Ti ho risposto ?

P.S. Comento al codice: se usavi qualche ciclo evitavi un codice di 300 righe

Ultima modifica effettuata da Phi il 04/03/2012 alle 20:32
PM Quote
Avatar
giosch (Normal User)
Rookie


Messaggi: 23
Iscritto: 16/03/2011

Segnala al moderatore
Postato alle 23:02
Domenica, 04/03/2012
Grazie della risposta.
Quello che non capivo e non trovavo era questo, le classi e cos'erano, ma ora ho trovato, anche se non sono affatto semplici. http://www.freepascal.org/docs-html/ref/refch6.html#x66-76 ...
La unit insetti è di un esercizio banale fatto a scuola, copiato da un libro, e è piena zeppa di errori e/o cose inutili (quella è solo una parte). Non l'ho scritta io,altrimenti non mi farei vedere in giro :rofl:
Comunque ho risolto, grazie di tutto

PM Quote