Спасибо, покопаюсь, может что получится
Добавлено спустя 2 часа 10 минут 25 секунд:Так начались проблемы...
Сделал модуль следующего содержания:
- Код: Выделить всё
- unit wxmplayer;
 
 {$mode objfpc}{$H+}
 
 {$DEFINE LCLGTK2}
 
 interface
 
 uses
 {$IFDEF UNIX}
 cthreads,
 {$ENDIF}
 Classes, SysUtils, x,
 {$IFDEF LCLGTK} gtk, gdk, glib, {$ENDIF}
 {$IFDEF LCLGTK2} gtk2, gdk2, glib2, gdk2x, {$ENDIF}
 Process, math, xlib, ExtCtrls;
 
 type
 TExProcess = class
 protected
 p: TProcess;
 s: string;
 function _GetExitStatus(): integer;
 public
 RezList:TStringList;
 constructor Create(commandline: string);
 procedure Execute;
 destructor Destroy;
 procedure OnReadLn(str: string);
 property ExitStatus: integer read _GetExitStatus;
 end;
 
 const buf_len = 3000;
 
 implementation
 
 function TExProcess._GetExitStatus(): integer;
 begin
 Result:=p.ExitStatus;
 end;
 
 constructor TExProcess.Create(commandline: string);
 begin
 RezList:=TStringList.Create;
 s:='';
 p:=TProcess.Create(nil);
 p.CommandLine:=commandline;
 p.Options:=[poUsePipes,poNoConsole];
 end;
 
 procedure TExProcess.Execute;
 var
 buf: string;
 i, j, c, n: integer;
 begin
 p.Execute;
 repeat
 SetLength(buf, buf_len);
 SetLength(buf, p.output.Read(buf[1], length(buf)));
 s:=s + buf;
 repeat
 i:=Pos(#13, s);
 j:=Pos(#10, s);
 if i=0 then i:=j;
 if j=0 then j:=i;
 if j = 0 then Break;
 OnReadLn(Copy(s, 1, min(i, j) - 1));
 s:=Copy(s, max(i, j) + 1, length(s) - max(i, j));
 until false;
 until buf = '';
 if s <> ''then
 OnReadLn(s);
 end;
 
 destructor TExProcess.Destroy;
 begin
 RezList.Free;
 p.Free;
 end;
 
 procedure TExProcess.OnReadLn(str: string);
 begin
 RezList.Add(str);
 end;
 
 type
 TMPlayer=class(TThread)
 public
 hWidget:THandle;
 fileName:string;
 xid:TWindow;
 pr:TProcess;
 pmplayer:string;
 constructor Create(AFilename:String);
 destructor destroy; override;
 procedure SetParentWidget(AWidget:thandle);
 protected
 procedure Execute; override;
 private
 end;
 
 constructor TMPlayer.Create(AFilename:String);
 var pf:TExProcess;
 begin
 inherited Create(true);
 filename:='"'+AFilename+'"';
 pf:=TExProcess.Create('which mplayer');
 pf.Execute;
 pmplayer:=pf.RezList[0]+' ';
 pf.Free;
 writeln('PLUGIN : found mplayer in :' + pmplayer);
 end;
 
 destructor TMPlayer.destroy;
 begin
 if pr.Running then
 pr.Terminate(0);
 pr.Free;
 inherited destroy;
 end;
 
 procedure TMPlayer.SetParentWidget(AWidget: THandle);
 var widget, mySocket:PGtkWidget;
 begin
 widget := gtk_vbox_new(FALSE,0);
 mySocket := gtk_socket_new();
 gtk_container_add (GTK_CONTAINER(widget), mySocket);
 gtk_widget_show(mySocket);
 gtk_widget_show(widget);
 gtk_container_add (GTK_CONTAINER (PGtkWidget(Awidget)), widget);
 gtk_widget_realize(mySocket);
 gtk_widget_hide(PGtkWidget(AWidget));
 {$IFDEF LCLGTK}
 xid:=(PGdkWindowPrivate(widget^.window))^.xwindow;
 {$ENDIF}
 {$IFDEF LCLGTK2}
 xid:=GDK_WINDOW_XID(widget^.window);
 {$ENDIF}
 hWidget:= THandle(widget);
 end;
 
 procedure TMPlayer.Execute;
 begin
 pr:=TProcess.Create(nil);
 pr.Options := Pr.Options + [poWaitOnExit,poNoConsole];
 pr.CommandLine:=pmplayer+fileName+' -wid '+IntToStr(xid);
 pr.Execute;
 end;
 end.
 
Создал новый проект, подключил этот модуль к нему, попробовал скомпилировать, приложение собирается удачно, но неработает... В консоли пишет:
Threading has been used before cthreads was initialized.
Make cthreads one of the first units in your uses clause.
Что с этим делать??? я так понял ему чтото ненравится в использовании модуля cthreads???