WorkerThread.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:5k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit WorkerThread;
  2.    (*********************************************************************
  3.     * The contents of this file are used with permission, subject to    *
  4.     * the Mozilla Public License Version 1.1 (the "License"); you may   *
  5.     * not use this file except in compliance with the License. You may  *
  6.     * obtain a copy of the License at                                   *
  7.     * http://www.mozilla.org/MPL/MPL-1.1.html                           *
  8.     *                                                                   *
  9.     * Software distributed under the License is distributed on an       *
  10.     * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or    *
  11.     * implied. See the License for the specific language governing      *
  12.     * rights and limitations under the License.                         *
  13.     *                                                                   *
  14.     * (C) 2004 Martin Offenwanger: coder@dsplayer.de                    *
  15.     *********************************************************************)
  16. {
  17. @author(Martin Offenwanger: coder@dsplayer.de)
  18. @created(Apr 22, 2004)
  19. @lastmod(Sep 09, 2004)
  20. }
  21. interface
  22. uses Windows, Classes, Asyncreader, config, ShoutCastStream, forms, baseclass;
  23. // TAsyncIO FilePlayback instance
  24. type
  25.   TWorkThread = class(TThread)
  26.   private
  27.     FIO: TAsyncIO;
  28.   protected
  29.     procedure Execute; override;
  30.   public
  31.     constructor Create(AIO: TAsyncIO);
  32.   end;
  33.   // This is the Thread instance of the TShoutcastStream class
  34. type
  35.   TThreadedShoutcastStream = class(TThread)
  36.   private
  37.     FMetaData: boolean;
  38.     FExitThread: boolean;
  39.     FTerminated: boolean;
  40.     FRipStream: boolean;
  41.     FFile: string;
  42.     FPath: string;
  43.     Factualpath: string;
  44.     FLock: TBCCritSec;
  45.     FAdress, FPort, FLocation: string;
  46.   protected
  47.     procedure Execute; override;
  48.   public
  49.     constructor Create(Adress, Port, Location: string; MetaData: boolean);
  50.     destructor Destroy; override;
  51.     function SetRipStream(RipStream: boolean; Path: string;
  52.       FileName: string): HRESULT;
  53.     function GetRipStream(out RipStream: boolean; out Path: string): HRESULT;
  54.   end;
  55. var
  56.   g_threadedShoutCastStream: TThreadedShoutcastStream;
  57. implementation
  58. constructor TWorkThread.Create(AIO: TAsyncIO);
  59. begin
  60.   inherited Create(True);
  61.   FreeOnTerminate := false;
  62.   FIO := AIO;
  63. end;
  64. procedure TWorkThread.Execute;
  65. begin
  66.   FIO.Process;
  67. end;
  68. destructor TThreadedShoutcastStream.Destroy;
  69. var
  70.   Application: TApplication;
  71. begin // no need to protect this function
  72.   // a protect will cause a deadlock !
  73.   FExitThread := true;
  74.   Application := TApplication.Create(nil);
  75.   while not FTerminated do
  76.   begin
  77.     Application.ProcessMessages;
  78.     Sleep(1);
  79.   end;
  80.   FLock.Free; // freeandnil seems to be more savety here
  81.   inherited Destroy;
  82. end;
  83. // TThreadedShoutcastStream.get_ripStream is not implemented yet
  84. function TThreadedShoutcastStream.GetRipStream(out RipStream: boolean;
  85.   out Path: string): HRESULT;
  86. //var l_ripstream: boolean;
  87. //    l_path: string;
  88. begin
  89.   FLock.Lock; // protect our member objects
  90.   {  if g_shoutCastStream <> nil then begin
  91.         g_shoutCastStream.get_ripStream(l_ripstream,l_path);
  92.         RipStream := l_ripstream;
  93.         Path := copy(l_path,1,length(l_path));
  94.         RESULT := S_OK;
  95.     end else    }
  96.   RESULT := E_FAIL;
  97.   FLock.UnLock;
  98. end;
  99. function TThreadedShoutcastStream.SetRipStream(RipStream: boolean; Path: string;
  100.   FileName: string): HRESULT;
  101. begin
  102.   FLock.Lock; // protect our member objects
  103.   FRipStream := RipStream;
  104.   FPath := copy(Path, 1, system.length(Path));
  105.   FFile := copy(FileName, 1, system.length(FileName));
  106.   Result := S_OK;
  107.   FLock.UnLock;
  108. end;
  109. constructor TThreadedShoutcastStream.Create(Adress, Port, Location: string;
  110.   MetaData: boolean);
  111. begin
  112.   inherited Create(false);
  113.   FLock := TBCCritSec.Create;
  114.   FMetaData := MetaData;
  115.   FRipStream := false;
  116.   FPath := '';
  117.   FExitThread := false;
  118.   FTerminated := false;
  119.   FAdress := Adress;
  120.   FPort := Port;
  121.   FLocation := Location;
  122. end;
  123. procedure TThreadedShoutcastStream.Execute;
  124. var
  125.   Application: TApplication;
  126.   RipStream: boolean;
  127.   ShoutCastStream: TShoutcastStream;
  128.   Temp: string;
  129. begin
  130.   FTerminated := false;
  131.   Temp := '';
  132.   ShoutCastStream := TShoutcastStream.Create;
  133.   ShoutCastStream.SetConnectToIp(FAdress, FPort, FLocation, FMetaData);
  134.   Priority := tpTimeCritical;
  135.   Application := TApplication.Create(nil);
  136.   // this is the mainloop of the tread
  137.   while not FExitThread do
  138.   begin
  139.     FLock.Lock; // protect our member objects
  140.     sleep(1);
  141.     Application.ProcessMessages;
  142.     ShoutCastStream.GetRipStream(RipStream, Temp);
  143.     if (RipStream <> FRipStream) or (Factualpath <> FPath) then
  144.     begin
  145.       ShoutCastStream.SetRipStream(FRipStream, FPath, FFile);
  146.       Factualpath := FPath;
  147.     end;
  148.     FLock.UnLock;
  149.   end;
  150.   if ShoutCastStream <> nil then
  151.   begin
  152.     ShoutCastStream.Destroy;
  153.   end;
  154.   FTerminated := true;
  155. end;
  156. end.