Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Stilgar - Dicembre 28, 2012, 08:38:32 pm

Titolo: Sempre Thread... questi rompiscatole
Inserito da: Stilgar - Dicembre 28, 2012, 08:38:32 pm
Ciao a tutti.
Allego un progetto.
Premetto che è più una prova che una cosa seria.
E' legato al problema di xinyiman ... ma a lui sotto linux da problemi, io l'ho sviluppato sotto windows.
"Semaphore init failed (possibily too many concurrent thread). "
Questo è l'errore che mi segnala.
Non ho un linux sotto mano (e non ho voglia di mettere su una macchina virtuale con linux).
C'è qualche anima pia che ci può aiutare a venirne fuori, prima di chiedere al forum inglese?

Stilgar
Titolo: Re:Sempre Thread... questi rompiscatole
Inserito da: Legolas - Dicembre 28, 2012, 09:14:00 pm
Questo problema l'ho già visto sul foro di Lazarus e nel bug traker. La soluzione dovrebbe essere quella di utilizzare esplicitamente la unit cthreads tramite {$DEFINE UseCThreads}, oppure passando -dUseCThreads al compilatore. Sto ancora scaricando Lazarus sulla VM Ubuntu, quindi non ho ancora provato per vedere se così si risolve...  :)
Titolo: Re:Sempre Thread... questi rompiscatole
Inserito da: Stilgar - Dicembre 28, 2012, 09:25:12 pm
Grande Legolas ;)
Titolo: Re:Sempre Thread... questi rompiscatole
Inserito da: Legolas - Dicembre 28, 2012, 10:04:10 pm
Ok, sembra funzionare a dovere  :D

Codice: delphi [Seleziona]
program Threads;

{$mode objfpc}{$H+}

uses
  {$DEFINE UseCThreads} // oppure togli tutti gli ifdef qui sotto
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, MainView, models
  { you can add units after this };

{$R *.res}

begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Titolo: Re:Sempre Thread... questi rompiscatole
Inserito da: Stilgar - Dicembre 28, 2012, 10:08:32 pm
Grande ;)
Titolo: Re:Sempre Thread... questi rompiscatole
Inserito da: xinyiman - Dicembre 28, 2012, 10:12:27 pm
Grazie ragazzi  :)
Titolo: Re:Sempre Thread... questi rompiscatole
Inserito da: bonmario - Dicembre 29, 2012, 10:32:21 am
La soluzione dovrebbe essere quella di utilizzare esplicitamente la unit cthreads tramite {$DEFINE UseCThreads}, oppure passando -dUseCThreads al compilatore.

Questa non la sapevo, io ho sempre aggiunto il parametro "-dUseCThreads" ... ottimo a sapersi !!!

Che tu sappia, se io dovessi usare i thread in una unit che a sua volta verrebbe usata in più progetti, posso aggiungere
Codice: [Seleziona]
  {$DEFINE UseCThreads}
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
direttamente nella unit o lo devo fare in ogni lpr di ogni progetto in cui userò quella unit?

Grazie, Mario
Titolo: Re:Sempre Thread... questi rompiscatole
Inserito da: Legolas - Dicembre 29, 2012, 10:45:47 am
In effetti -d e {$DEFINE } sono due modi differenti di fare la stessa cosa.  :)
Da quello che so, poi, cthreads deve essere la prima unit definita nel progetto, quindi andrebbe messa nel file lpr.
Titolo: Re:Sempre Thread... questi rompiscatole
Inserito da: bonmario - Gennaio 31, 2013, 08:53:39 am
Da quello che hai scritto, credo di sapere già la risposta, ma preferisco chiederlo ugualmente, magari ho capito male io .... ma veniamo al dunque:

Codice: [Seleziona]
  {$DEFINE UseCThreads}
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}

se dovessi fare una unit contenente la gestione di un Thread, dovrei aggiungere le righe qui sopra nell'LPR di tutti i progetti che usano questa unit. Se le mettessi direttamente nella unit non funzionerebbe. E' corretto?

Grazie, Mario