使用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的建议都表示赞赏.
德尔福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中创建有吸引力的侧边栏菜单,如下图所示?

TCAtegoryPanelGroup和TCategoryPanel工作正常,但是为了将菜单项添加到TCategoryPanel并使其时尚和有吸引力,就像图中所示的那样复杂.虽然TJvXpBar是我想要的东西但是在背景中我想要一个能够区分左侧部分和右侧部分的面板,如下图所示,以及在运行时最大化窗体时自动扩展.
http://s5.postimg.org/6e6dfb4sn/interface.jpg
我希望GUI界面如上图所示,默认为800*400像素,如上图所示.应该在TJvXpBar的背景使用哪个面板(如图所示),以便在运行时(1366*768)最大化时,背景面板(条带)不会从上到下断开.
(请检查界面图像的链接,无法在编辑模式下添加图像)
我在项目中使用线程.我想立即杀死并终止一个线程.
样品:
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;也不起作用.
谢谢.
我在网上找到了这段代码,但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) 我有一个项目,其中多个单位有初始化部分.我想控制执行此块的顺序.
根据以下问题,这是基于单位编制的顺序,因此最终订单应基于源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,但我无法在一个新项目上重新产生这个问题.
我尝试重建项目但没有成功.
我错过了什么?
在尝试让Log4D在XE4中编译时,我看到了
[dcc32错误] Log4D.pas(2139):E2003未声明的标识符:'ShortDateFormat'
在这条线上:
SetOption(DateFormatOpt, ShortDateFormat);
Run Code Online (Sandbox Code Playgroud)
谷歌搜索有一点使我改变的解决方案ShortDateFormat来FormatSettings.ShortDateFormat,这导致了XE4以下编译代码:
SetOption(DateFormatOpt, FormatSettings.ShortDateFormat);
Run Code Online (Sandbox Code Playgroud)
不过,我真的不明白,为什么能解决的事情,为什么它的需要来指定FormatSettings,因为我已经包含SysUtils在我的用途声明,其次,我不知道如何重写这一行继续向后用Delphi的版本兼容这个开源项目已经支持了.
我想我可以在任何版本的Delphi引入的参数或代码行周围添加一个IFDEF FormatSettings- 但我甚至不确定Delphi的版本是什么,更不用说这是解决这个问题的好方法还是坏方法.
我正在寻找一种方法在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)
它们在浮点产生相同结果的地方.newnumber1和newnumber2显然是用于单和双打不同.我需要一些值,我可以从我的A中减去并添加到我的C值以获得newnumber1和newnumber2,或者我需要一种从B和D获取这些数字的方法.
在C++ 11中,有一个方法std::nextafter在这个问题中引用,看起来就足够了.
上下文
我正在做矢量操作,我需要做相当于大于或等于.实现此目的的最简单方法是采用稍微小一些的数字,并使用大于操作的数字.如果可能的话,我宁愿不要嘲笑似乎有效的价值.
我正在使用的向量操作是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 XE4中是否有类似Java的Map?如果是的话,欢迎一些解释.我想将命令提示符params转换为映射以通过键访问它们(通过预期的param名称).