小编Mic*_*hre的帖子

什么是TExternalThread?终止基于线程的计时器时"无法终止外部创建的线程"

这种情况发生在关闭我的应用程序的一半时间,在该应用程序中,我在设计时将TLMDHiTimer放置在我的表单上,Enabled设置为true.在我的OnFormClose事件中,我调用MyLMDHiTimer.Enabled:= false.当这个被调用时,我有时(大约一半的时间)得到这个例外.

我调试并进入调用,发现它是LMDTimer.pas中的第246行,它给出了这个错误.

FThread.Terminate;
Run Code Online (Sandbox Code Playgroud)

我使用的是最新版本的LMDTools.我在周末之前完成了LMD工具的重新安装,并且已经将组件移除并重新添加到表单中.

根据我的发现,这与TExternalThread有关,但Embarcadero没有关于它的文档,我没有在LMDTools源代码中找到任何引用它的文档.

使用完全更新的RAD Studio 2010,Delphi 2010.

让我感到不安的是,没有任何文件.谷歌实际上谈到了一个结果,其中有人说错误是由于试图终止TExternalThread造成的.但是看看这个LMDHiTimer的源代码,不是一次它的目的是做任何事情,而是创建一个常规的TThread.我可以找到一个google结果,Thread:无法终止外部创建的线程?在Embarcadero上提到使用GetCurrentThread()和GetCurrentThreadId()来获取挂钩到现有线程所需的数据,但TLMDHiTimer没有这样做.它只是创建自己的TThread后代,它有自己的Create()构造函数(当然是重写,并且在构造函数的开头继承了调用)

那么......这个TExternalThread到底是什么?还有其他人遇到过这种例外吗?也许找出了解决方案或解决方法?我已经向LMDTools自己的支持提出了几乎完全相同的问题,但在多个地方提问并不会有什么问题.

提前感谢您的任何帮助.

delphi multithreading external delphi-2010

12
推荐指数
2
解决办法
6566
查看次数

Directsound - 播放来自网络数据的流媒体缓冲区的问题!为Delphi使用移植的DirectX头文件

再回到另一个DirectSound问题,可以使用关于DirectSound缓冲区的方法:

我通过网络以大约30ms的间隔进入包含音频数据的数据包,该数据被应用程序的其他部分解码为原始wav数据.

当Indata事件由这些其他代码片段触发时,我基本上将其放入以音频数据作为参数的过程中.

DSCurrentBuffer初始化如下:

ZeroMemory(@BufferDesc, SizeOf(DSBUFFERDESC));
wfx.wFormatTag := WAVE_FORMAT_PCM;
wfx.nChannels := 1;
wfx.nSamplesPerSec := fFrequency;
wfx.wBitsPerSample := 16;
wfx.nBlockAlign := 2; // Channels * (BitsPerSample/8)
wfx.nAvgBytesPerSec := fFrequency * 2; // SamplesPerSec * BlockAlign

BufferDesc.dwSize := SizeOf(DSBUFFERDESC);
BufferDesc.dwFlags := (DSBCAPS_GLOBALFOCUS or DSBCAPS_GETCURRENTPOSITION2 or
    DSBCAPS_CTRLPOSITIONNOTIFY);
BufferDesc.dwBufferBytes := BufferSize;
BufferDesc.lpwfxFormat := @wfx;

case DSInterface.CreateSoundBuffer(BufferDesc, DSCurrentBuffer, nil) of
  DS_OK:
    ;
  DSERR_BADFORMAT:
    ShowMessage('DSERR_BADFORMAT');
  DSERR_INVALIDPARAM:
    ShowMessage('DSERR_INVALIDPARAM');
end;
Run Code Online (Sandbox Code Playgroud)

我将此数据写入我的辅助缓冲区,如下所示:

var
FirstPart, SecondPart: Pointer;
FirstLength, SecondLength: DWORD;
AudioData: Array [0 .. 511] of Byte;
I, K: Integer; …
Run Code Online (Sandbox Code Playgroud)

delphi directx voip directsound delphi-2010

6
推荐指数
1
解决办法
4808
查看次数