Recent

Author Topic: Поясните про мультитрейдинг  (Read 1437 times)

sydenis

  • New Member
  • *
  • Posts: 13
Поясните про мультитрейдинг
« on: May 16, 2021, 03:08:48 pm »
Ubuntu 20.04 + Lazarus 2.0.12
Открываю пример из /usr/share/lazarus/2.0.12/examples/multithreading/multithreadingexample1.lpr
Компилирую и всё работает.
Пишу свой такой же, практически копипастой - крашится сразу при создании объекта TThread.

Читаю вот тут - оказывается надо вписать директиву {$define UseCThreads} в файле проекта.
И, да - с ней мой проект сразу компилируется и работает как надо.

Но почему про это нет в оф.доке , и главное, почему этой директивы нет в примере из поставки?
Что за мистика - может кто пояснить?

Alextp

  • Hero Member
  • *****
  • Posts: 1275
    • UVviewsoft
Re: Поясните про мультитрейдинг
« Reply #1 on: May 16, 2021, 03:54:39 pm »
Пример из поставки может юзать некий юнит в котором есть {$define}.

tetrastes

  • Full Member
  • ***
  • Posts: 117
Re: Поясните про мультитрейдинг
« Reply #2 on: May 16, 2021, 04:36:32 pm »
В примере из поставки английским по белому написано, что в юниксах надо uses cthreads, и сделать это можно и без этой директивы  ;D

Code: Pascal  [Select][+][-]
  1. program MultiThreadingExample1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. uses
  6.   // for multi threading the cthreads unit must be used on unix systems:
  7.   // for example: Linux, MacOSX, FreeBSD, Solaris
  8.   {$IFDEF UNIX}
  9.   cthreads,
  10.   {$ENDIF}
  11.  

sydenis

  • New Member
  • *
  • Posts: 13
Re: Поясните про мультитрейдинг
« Reply #3 on: May 16, 2021, 05:19:45 pm »
Пример из поставки может юзать некий юнит в котором есть {$define}.
Это возможно. Придётся просмотреть все стандартные модули, которые там в uses. Возможно в каком-то из них случайно есть эта директива.
Это всё объяснило бы.

Quote
В примере из поставки английским по белому написано
Коллега, внимательней! ) 
Я спрашивал про директиву компилятора {$define UseCThreads}. Без неё сthreads можно заюзать хоть во всех модулях  - всё равно будет краш.
Вопрос был, где её спрятали в примере и почему про неё не пишут в доке.

tetrastes

  • Full Member
  • ***
  • Posts: 117
Re: Поясните про мультитрейдинг
« Reply #4 on: May 16, 2021, 06:10:34 pm »
Коллега, внимательней! ) 
Я спрашивал про директиву компилятора {$define UseCThreads}. Без неё сthreads можно заюзать хоть во всех модулях  - всё равно будет краш.
Вопрос был, где её спрятали в примере и почему про неё не пишут в доке.

Ну так я и ответил, что директива не обязательна, потому и в примере ее нет. Нужна cthreads, и не во всех модулях, а только в lpr, поскольку она подцепляет к программе сишную библиотеку (libpthreads в линуксе). И директива эта только для этого в lpr и присутствует, и можно ее оттуда стереть или закомментировать:
Code: Pascal  [Select][+][-]
  1. program project1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. uses
  6.     {$IFDEF UNIX}       //{$IFDEF UseCThreads}
  7.     cthreads,
  8.     {$ENDIF}            //{$ENDIF}
  9.  

А уж почему про нее в доке не пишут, я не знаю.
И ничего "крашиться" не должно. Если не лень и не жалко, приложите архив с минимальным проектом, который крашится.

(Задним числом подправил, чтоб было понятнее)
« Last Edit: May 16, 2021, 08:57:05 pm by tetrastes »

sydenis

  • New Member
  • *
  • Posts: 13
Re: Поясните про мультитрейдинг
« Reply #5 on: May 17, 2021, 08:37:18 am »
Кажется нашёл.
По дефолту пустой проект Лазаруса создаётся с таким хедером в .lpr
Code: Pascal  [Select][+][-]
  1. uses
  2.   {$IFDEF UNIX}{$IFDEF UseCThreads}
  3.   cthreads,
  4.   {$ENDIF}{$ENDIF}
а в примере из поставки:
Code: Pascal  [Select][+][-]
  1.   {$IFDEF UNIX}
  2.   cthreads,
  3.   {$ENDIF}

Когда убираем {$IFDEF UseCThreads} то проект сразу взлетает.
Такие вот грабельки...

tetrastes

  • Full Member
  • ***
  • Posts: 117
Re: Поясните про мультитрейдинг
« Reply #6 on: May 17, 2021, 08:44:46 am »
Тоже мне грабельки...  :D

sydenis

  • New Member
  • *
  • Posts: 13
Re: Поясните про мультитрейдинг
« Reply #7 on: May 17, 2021, 10:00:28 am »
Поимев полдня хорошего секса с никак не запускающимся кодом, я не могу разделить вашего веселья  :D
По-хорошему надо в доке предупреждать, что либо трусы, либо крестик...
  • Или вы явно в своём коде указываете {$define UseCThreads}
    Тогда проверка {$IFDEF UseCThreads} проходит и код работает.
  • Либо вы отключаете проверку и тогда  use cthreads всегда работает и ваш код тоже запускатеся
Иначе ловим необъяснимый вылет на пустом месте...

tetrastes

  • Full Member
  • ***
  • Posts: 117
Re: Поясните про мультитрейдинг
« Reply #8 on: May 17, 2021, 10:21:31 am »
Вообще-то это выясняется за пару минут, если быть самому внимательным к исходникам и ответам на свои вопросы, а не советовать это другим.
Что касается доков, вы много хотите от свободного ПО. Никто вам ничего не должен, не нравится - не ешь  :P . Купите Дельфи и будет вам счастье. Кстати, в приведенной вами ссылке все-таки есть упоминание об этой пресловутой директиве.

 

TinyPortal © 2005-2018