标签: delphi-xe4

为什么OmniThreadLibrary的ForEach阻塞主线程?

使用OmniThreadLibrary和Delphi XE4,我希望运行多个在后台处理数据的线程,为我现有的代码增加速度.

调用下面的过程时,Application GUI将停止处理任何输入,直到所有线程都完成为止.我的理解是,.NoWait即使线程正在运行,using也应允许该过程退出.

procedure Test(input: TStringList; output: TList<TMaintFore>);
var
  outQueue: IOmniBlockingCollection;
  transaction: TOmniValue;
begin
  outQueue := TOmniBlockingCollection.Create;
  Parallel.ForEach(0, input.Count - 1)
    .NoWait
    .Into(outQueue)
    .Execute(
      procedure(const value: integer; var result: TOmniValue)
      begin
        result := TMaintFore.Create(input[value]);
      end
    );
end;
Run Code Online (Sandbox Code Playgroud)

我对ForEach循环的理解是否不正确,建议我应该使用替代方法来实现后台处理?任何关于正确使用OmniThreadLibrary的建议都表示赞赏.

delphi omnithreadlibrary delphi-xe4

2
推荐指数
1
解决办法
1207
查看次数

如何在Delphi中连接(导入)WinApi函数

德尔福Xe4.例如,有两个函数(Unicode):

CryptAcquireContext,CryptGetProvParam.

我在MSDN上阅读说明:

1)http://msdn.microsoft.com/en-us/library/windows/desktop/aa379886(v=vs.85 ) .aspx

BOOL WINAPI CryptAcquireContext(
  _Out_  HCRYPTPROV *phProv,
  _In_   LPCTSTR pszContainer,
  _In_   LPCTSTR pszProvider,
  _In_   DWORD dwProvType,
  _In_   DWORD dwFlags);
Run Code Online (Sandbox Code Playgroud)

2)http://msdn.microsoft.com/en-us/library/windows/desktop/aa379929(v=vs.85 ) .aspx

BOOL WINAPI CryptEnumProviders(
  _In_     DWORD dwIndex,
  _In_     DWORD *pdwReserved,
  _In_     DWORD dwFlags,
  _Out_    DWORD *pdwProvType,
  _Out_    LPTSTR pszProvName,
  _Inout_  DWORD *pcbProvName);
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,那么翻译成Delphi应该是这样的:

    {S} Function CryptAcquireContext(Out hpProv:PNativeUInt;Const Container:PWideChar;
Const Provider:PWideChar;Const ProvType:DWord;Const Flags:DWord):Bool; StdCall; External Advapi32dll Name 'CryptAcquireContextW';

    {S} Function CryptEnumProviders(Const Index:DWord;Const Reserved:PDWord;Const Flags:DWord;
Out ProvType:PDWord;Out pszProvName:DWord;Var pcbProvName:DWord):Bool; StdCall; External Advapi32dll Name 'CryptEnumProvidersW'; …
Run Code Online (Sandbox Code Playgroud)

delphi winapi delphi-xe4

2
推荐指数
1
解决办法
1657
查看次数

如何在德尔福创建有吸引力的侧栏菜单

如何在Delphi中创建有吸引力的侧边栏菜单,如下图所示?

在此输入图像描述

TCAtegoryPanelGroup和TCategoryPanel工作正常,但是为了将菜单项添加到TCategoryPanel并使其时尚和有吸引力,就像图中所示的那样复杂.虽然TJvXpBar是我想要的东西但是在背景中我想要一个能够区分左侧部分和右侧部分的面板,如下图所示,以及在运行时最大化窗体时自动扩展.

http://s5.postimg.org/6e6dfb4sn/interface.jpg

我希望GUI界面如上图所示,默认为800*400像素,如上图所示.应该在TJvXpBar的背景使用哪个面板(如图所示),以便在运行时(1366*768)最大化时,背景面板(条带)不会从上到下断开.

(请检查界面图像的链接,无法在编辑模式下添加图像)

delphi delphi-xe4

2
推荐指数
1
解决办法
6448
查看次数

无法终止线程

我在项目中使用线程.我想立即杀死并终止一个线程.

样品:

    type
      test = class(TThread)
      private
        { Private declarations }
      protected
        procedure Execute; override;
      end;

    var
     Form1: TForm1;
     a:tthread;

    implementation

    {$R *.dfm}

    procedure test.Execute;
    begin

      Synchronize(procedure begin    
          form1.ProgressBar1.position := 0;
          sleep(5000);
          form1.ProgressBar1.position := 100;    
      end
      );

    end;

   procedure TForm1.btn_startClick(Sender: TObject);
   begin
     a:=test.Create(false);
   end;

   procedure TForm1.btn_stopClick(Sender: TObject);
   begin
     terminatethread(a.ThreadID,1);  //Force Terminate
   end;
Run Code Online (Sandbox Code Playgroud)

但是当我点击btn_stop(点击后btn_start),线程不会停止.那么如何立即停止这个线程呢?

BTW a.terminate;也不起作用.

谢谢.

delphi multithreading delphi-xe4

2
推荐指数
1
解决办法
933
查看次数

VCL.Bitmap到FMX.Bitmap

我在网上找到了这段代码,但FMX.Bitmap没有扫描线.有可能以某种方式将VCL.TBitmap复制或绘制到FMX.Bitmap吗?

{$IFDEF MSWINDOWS}
type
  TBitmap = FMX.Types.TBitmap;
  TVclBitmap = Vcl.Graphics.TBitmap;

procedure TakeScreenshot(Dest: FMX.Types.TBitmap);
var
  DC: HDC;
  Size: TPointF;
  VCLBitmap: TVclBitmap;
  Y: Integer;
begin
  VCLBitmap := nil;
  //Size := FMX.Platform.IFMXScreenService.GetScreenSize;
  DC := GetDC(0);
  try
    VCLBitmap := TVclBitmap.Create;
    VCLBitmap.PixelFormat := pf32bit;
    VCLBitmap.SetSize(Trunc(Size.X), Trunc(Size.Y));
    BitBlt(VCLBitmap.Canvas.Handle, 0, 0, VCLBitmap.Width, VCLBitmap.Height,
      DC, 0, 0, SRCCOPY);
    Dest.SetSize(VCLBitmap.Width, VCLBitmap.Height);
    { The format of a FMX bitmap and a 32 bit VCL bitmap is the same, so just
      copy the scanlines. - not true- FMX bitmap does not …
Run Code Online (Sandbox Code Playgroud)

delphi firemonkey delphi-xe4

2
推荐指数
1
解决办法
3407
查看次数

单位初始化顺序不在源中指示

我有一个项目,其中多个单位有初始化部分.我想控制执行此块的顺序.

根据以下问题,这是基于单位编制的顺序,因此最终订单应基于源DPR的使用条款中的单位安排.

以下是我项目的DPR来源:

program X;

uses
  Vcl.Forms,
  uMain in 'uMain.pas' {MainForm},
  uFooA in 'uFooA.pas',
  uFooB in 'uFooB.pas';

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;

end.
Run Code Online (Sandbox Code Playgroud)

我的问题是,这根本不是初始化块的执行顺序.

How it should be |  How it actually is
                 | 
  1. uMain       |     1.uFooA
  2. uFooA       |     2.uFooB  
  3. uFooB       |     3.uMain
Run Code Online (Sandbox Code Playgroud)

我很想提供一个SSCCE,但我无法在一个新项目上重新产生这个问题.

我尝试重建项目但没有成功.

我错过了什么?

delphi delphi-xe4

2
推荐指数
1
解决办法
618
查看次数

ShortDateFormat vs FormatSettings.ShortDateFormat?

在尝试让Log4D在XE4中编译时,我看到了

[dcc32错误] Log4D.pas(2139):E2003未声明的标识符:'ShortDateFormat'

在这条线上:

SetOption(DateFormatOpt, ShortDateFormat); 
Run Code Online (Sandbox Code Playgroud)

谷歌搜索有一点使我改变的解决方案ShortDateFormatFormatSettings.ShortDateFormat,这导致了XE4以下编译代码:

SetOption(DateFormatOpt, FormatSettings.ShortDateFormat); 
Run Code Online (Sandbox Code Playgroud)

不过,我真的不明白,为什么能解决的事情,为什么它的需要来指定FormatSettings,因为我已经包含SysUtils在我的用途声明,其次,我不知道如何重写这一行继续向后用Delphi的版本兼容这个开源项目已经支持了.

我想我可以在任何版本的Delphi引入的参数或代码行周围添加一个IFDEF FormatSettings- 但我甚至不确定Delphi的版本是什么,更不用说这是解决这个问题的好方法还是坏方法.

delphi datetime delphi-xe4 log4d

2
推荐指数
1
解决办法
9812
查看次数

将浮点"> ="转换为">"并将"<="转换为"<"

我正在寻找一种方法在Delphi中获取最小的单浮点值和双浮点值,我可以添加或减去或添加到我的数字,以使浮点数比较的数字不同.或者,如果我可以获得比我的数字更小和更大的下一个浮点数.从浮点的角度来看,我想转换这个:

if (A >= B) or (C <= D) then
Run Code Online (Sandbox Code Playgroud)

if (A > newnumber1) or (C < newnumber2) then
Run Code Online (Sandbox Code Playgroud)

它们在浮点产生相同结果的地方.newnumber1newnumber2显然是用于单和双打不同.我需要一些值,我可以从我的A中减去并添加到我的C值以获得newnumber1和newnumber2,或者我需要一种从B和D获取这些数字的方法.

在C++ 11中,有一个方法std::nextafter在这个问题中引用,看起来就足够了.

在C++中查找最接近的浮点值小于特定的整数值?

上下文

我正在做矢量操作,我需要做相当于大于或等于.实现此目的的最简单方法是采用稍微小一些的数字,并使用大于操作的数字.如果可能的话,我宁愿不要嘲笑似乎有效的价值.

我正在使用的向量操作是ippsThreshold_LTValGTVal_32s来自:

https://software.intel.com/en-us/node/502143

该库显然不支持> =操作.这在浮点意义上是不实际的.要创建一个等效函数,我需要增加和减少我的比较值来计算它,然后使用大于操作和小于操作.

例如

如果我有一个包含5个值的数组[99.4,20,19.9,99,80],ippsThreshold_LTValGTVal_32s向量操作将允许我用我自己的替换值替换向量中的特定值.在这个例子中,我想用0替换所有值> = 99和<= 20.要做到这一点,我想传递这样的东西.因此,我必须用略小的东西替换99,用稍微大一些的东西替换20.

函数签名如下所示:

ippsThreshold_LTValGTVal_32s(..., ..., ..., levelLT, valueLT, levelGT, valueGT);
Run Code Online (Sandbox Code Playgroud)

我的电话会是这样的:

ippsThreshold_LTValGTVal_32s(..., ..., ..., 20.00000001, 0, 98.99999, 0);
Run Code Online (Sandbox Code Playgroud)

然后,这将包括用于小于操作的20和用于大于操作的99,并且给出一个看起来像[0,0,0,0,80]的向量.

我需要找出20.0000001和98.999999的用途.我希望这些值之间的差异和原始值尽可能小,同时仍然足够重要,以包括>和<操作中的值.

delphi simd delphi-xe4

2
推荐指数
1
解决办法
274
查看次数

Delphi XE4 IDE,如何始终隐藏Object Inspector的底部窗格

位于Obeject Inspector底部的两个窗格根本没用,而且它不必要地消耗屏幕,如下面的屏幕截图所示.如何在重新启动IDE后禁用这两个窗格?内置选项或第三方插件对我来说没问题.谢谢. 在此输入图像描述

delphi delphi-ide delphi-xe4

2
推荐指数
1
解决办法
213
查看次数

Delphi XE4中是否有TMap类?

在Delphi XE4中是否有类似Java的Map?如果是的话,欢迎一些解释.我想将命令提示符params转换为映射以通过键访问它们(通过预期的param名称).

delphi delphi-xe4

2
推荐指数
1
解决办法
349
查看次数