Please include the project .lpr and .lpi files into your package next time. Now I created a new project, added your files there and changed the main form manually.
For portability you must define "UseCThreads" (for Linux at least) as noted here:
http://lazarus.firmos.at/index.php?topic=8852.0I found a small error but it didn't create any problems because FmemStream is not used anywhere:
constructor TThreadMessageObject.Create(const Command, Params: string);
begin
Create; // Call Constructor above. (was: inherited Create;)
FCommand := Command;
FParams := Params;
end;
ThreadQueue:=TThreadQueue(FThreadList.Objects[FThreadList.IndexOf(IntToStr(ThreadId))]);
Using TStringList.Objects property is OK but now you had to use IntToStr just to get the right data type. Not good indeed!
A Java-like TMap<TThreadID, ThreadQueue> would be just perfect here. In fact there are generics containers in FPC trunk 2.5.1. You can experiment with them if you like.
There may be the right container type available in the current libraries, too, but I don't know where.
Member FThreadManager isn't visible to subclass because it is private. It should be protected. Note also the warnings like:
"clientthread1.pas(15,15) Note: Virtual method "TClientThread1.Execute;" has a lower visibility (private) than parent class TThread (protected)"
When I "Stop ClientThreads" I get an exception:
"Suspending one thread from inside another one is unsupported (because it is unsafe and deadlock prone) by *nix and posix operating systems."
It seems suspending a thread is not portable.
Otherwise it is a very international program. It even has "Ikkuna" and "Fönster". Congratulations! :-)
Juha