My previous note was about running the ALSA
aplay
utility in a thread. I have been running into difficulty
turning that approach into a general "process in a thread" module. More
about that latter perhaps. In the meantime, I thought I should produce
this short note to remind myself about the little twist introduced when using
threads in Free Pascal for the Unix/Linux environment.
The documentation is clear,
Note that including this unit links your program to the C library of the system.
It makes no sense to use this unit on a non-posix system: Windows, OS/2 or DOS, therefor it should always between an ifdef statement:
program myprogram; uses {$ifdef unix}cthreads{$endif}, classes, sysutils;
The Lazarus IDE inserts this conditional automatically for each new started program.
Actually, this is not quite how it works at least on my version of the Lazarus IDE. If I depend on this supposed automatic mechanism, here is the error message I get.
When the Break button is clicked then the listing in the Assembler window makes it clear that there is a thread error of some type.
Starting the program in a terminal will be even more informative.
The same output can be seen when running the program from the IDE. To
see its output, open Console window by pressing the key combination
AltCtrlO
or selecting it from the menu: View/Debug Windows/Terminal Output
.
The problem is that cthread
is not loaded by default
and the reason becomes the clear when looking at the program source (IDE
menu: Project/View Project Source
).
Note how cthread
is wrapped in two conditional directives.
While UNIX
is defined, UseCThreads
is not which
explains the missing unit.
The solution is simply to remove the {$IFDEF UseCThreads}
and matching {£ENDIF}
.
Another solution is to define the directive. Do this in the
Project Options
window. This window is displayed by choosing
Project/Project Options
in the menu, and
Custom Options
in the Compiler Options
in
the list of options on the left. For each defined Build modes
,
click on the Defines... button on the right hand and
start typing the name of the define UseCThreads
in the edit
window. The Add button will be enabled, click on it
when UseCThreads
is fully entered.
The define will then be listed below along with a checkbox to the left. Check this box and click on the OK button.
I go through the above steps three times, once for each build mode. Is there an easier way of adding this define? Perhaps just editing the project source code is more efficient.