在销毁某些线程时,我遇到了有时遇到死锁的问题.我试图调试问题但是在IDE中调试时似乎永远不存在死锁,可能是因为IDE中事件的速度很慢.
问题:
主线程在应用程序启动时创建多个线程.线程始终处于活动状态并与主线程同步.没问题.当应用程序结束时,线程被销毁(mainform.onclose),如下所示:
thread1.terminate;
thread1.waitfor;
thread1.free;
Run Code Online (Sandbox Code Playgroud)
等等.
但有时其中一个线程(使用synchronize将一些字符串记录到备忘录中)将在关闭时锁定整个应用程序.我怀疑当我调用waitform并且harmaggeddon发生时线程正在同步,但这只是猜测,因为在调试时永远不会发生死锁(或者我从来没有能够重现它).有什么建议?
我正在研究Delphi程序,它将在"托盘"上显示一个图标.我正在"艰难的方式"(使用Shell_NotifyIcon api等,而不是组件,这里的原因除外).它工作正常,但有时似乎某些系统中的图标有点"模糊".现在,我已经尝试使用16x16 bmp,32x32等.似乎系统将其缩小到所需的大小,但结果根据操作系统版本(或者其他可能的东西)而有所不同....
您是否有任何关于BMP的最佳尺寸和颜色深度的经验,使用ShellI上的Shell_NotifyIcon提取并显示在托盘上?
我有一个对象x,需要从几个(5+个线程)访问.对象的结构是
Tx = class
private
Fx: integer;
public
property x: integer read Fx read Fx;
etc;
Run Code Online (Sandbox Code Playgroud)
什么是更好(最优雅)的保护方式:
一个)
Tx = class
private
Fx: integer;
public
property x: integer read Fx read Fx;
public
constructor Create; <--- Create the criticalsection here
destructor Destroy; <--destroy it here
etc;
var
cs: TCriticalSection;
Obj: Tx;
function GetSafeObject(): Tx;
begin
CS.Enter;
try
Result:= Obj;
finally
CS.Leave;
Run Code Online (Sandbox Code Playgroud)
结束;
并始终将对象作为GetSafeObj()访问.x:= 3;
要么
Tx = class
private
Fx: integer;
FCS: TCriticalSection;
public
property x: integer read GerX read …Run Code Online (Sandbox Code Playgroud) 使用Delphi,我需要一个函数来评估当前日期,看看它是否是,例如,当月的第三个星期日等.
在伪代码中:
function IsFirst(const CurrentDateTime: TDateTime; const Day: Word): Boolean;
/// Day can be 1-7 (monday to sunday)
begin
Result:= ??
end;
Run Code Online (Sandbox Code Playgroud)
计算本月的第二,第三,第四和最后一个时需要另一个功能.DateUtils似乎没有那样的东西.有任何想法吗?
我多年来一直使用Indy通过FTP传输文件,但未能找到满意的解决方案来解决以下问题.
当用户在路由器后面上传大文件时,有时会发生以下情况:文件上传正常,但同时命令通道因超时而断开连接.通常,直接连接到服务器不会发生这种情况,因为服务器"知道"正在数据通道上进行传输.但是有些路由器并未意识到这一点,并且命令通道已关闭.
许多程序定期发送NOOP命令以保持命令通道处于活动状态,即使这不是标准FTP规范的一部分.我的问题:我该怎么做?我是否在OnWork事件中发送NOOP命令?这是否会以某种方式造成任何附带损害,例如,我是否需要处理某些响应?我该如何最好地解决这个问题?
使用Delphi XE2,您可以选择将自定义样式(外观)嵌入到VCL项目中.
一切正常.现在我将一些表单放入一个动态显示的分隔dll中.
当然那些没有剥皮.我该如何纠正?
我想我必须以某种方式打电话给TVisualStyle,但没有运气.
主人:
procedure TForm1.Button1Click(Sender: TObject);
var
l: THandle;
p: procedure (const h: THandle); stdcall;
begin
l:= LoadLibrary('project1.dll');
if l > 0 then
begin
@p:= GetProcAddress(l,'ShowIt');
p(Application.Handle);
FreeLibrary(l);
end;
end;
Run Code Online (Sandbox Code Playgroud)
dll:
procedure ShowIt(const h: THandle);stdcall;
var
form: TForm;
b: TButton;
han: THandle;
begin
han:= Application.Handle;
Application.Handle:= h;
form :=Tform.Create(Application);
b:= TButton.Create(form);
b.Parent:= form;
b.Caption:= 'ytes';
b.Left:= 2;
b.Top:= 2;
form.ShowModal;
form.Release;
Application.Handle:= han;
end;
exports ShowIt ;
begin
end.
Run Code Online (Sandbox Code Playgroud)
很标准的东西.现在,要使dll表单使用主机的样式主题,究竟必须做些什么?
最佳实践是什么?我正在创建一个ASP.NET网站,用户可以在其中输入要存储在 SQL 数据库中的文本数据。我用来HttpUtility.HTNLEncode()存储数据并HTMLDecode显示它。
这很有效,但搜索(选择或自由文本)要困难得多。用户应该能够输入包含 <、"、' 和任何其他有问题的字符的文本。
最佳实践是什么?存储未编码的数据?那么如何降低注射风险呢?
我正在使用最新的indy快照(昨天安装)和最新的SSL库.
当尝试使用idSMTP发送邮件时,组件第一次连接时,我得到一个例外:
无法加载SSL库
.有趣的是,重试总是有效.调试我发现问题出在IsSSLOpenSSLHeader,函数Loaad:boolean,line
@OpenSSL_add_all_algorithms := LoadFunctionCLib('OpenSSL_add_all_algorithms');
Run Code Online (Sandbox Code Playgroud)
为什么它第一次失败而不是第二次对我来说仍然是一个谜,但在我继续调查之前,我想好像有人知道这个问题的解决方案.
我在Delphi 2010中一直在试验TMask,它似乎按预期工作,除了在一种情况下:当掩码名称包含[或]时,掩码似乎总是返回false.例如:
var
MaskObj : TMask;
begin
MaskObj:= TMask.Create('c:\[test]\*');
try
Result:= MaskObj.Matches('c:\[test]\text');
finally
FreeAndNil(MaskObj);
end;
end;
Run Code Online (Sandbox Code Playgroud)
返回false....
是的,[和]是文件名中的合法字符.因此,如果我想排除例如c:[test]*中的所有文件,我该怎么办?我唯一的解决方案是在检测到[但是这对于大量文件来说会很慢时执行StringReplace :
if (pos('[', Mask)>0) then
begin
mask:= ReplaceString(Mask, '[','_', etc...
// and do the same for the file name---
end;
Run Code Online (Sandbox Code Playgroud)
还有其他方法吗?
我在dll中创建一个表单.没有包裹.使用导出的过程调用dll中的表单:
procedure ShowAbout(const AppHandle: THandle); stdcall;
var
aHandle: THandle;
form: TfrmAbout; / my form in some other unit in the dll
begin
aHandle:= Application.Handle;
Application.Handle:= AppHandle;
form :=TfrmAbout.Create(Application);
form.ShowModal;
form.Free;
Application.Handle:= aHandle;
end;
Run Code Online (Sandbox Code Playgroud)
表格显示良好,没有问题.现在,我唯一希望它做的是将行为定位为poMainFormCenter(我希望它始终显示在主窗体上(调用dll的窗体).
我尝试过使用form:= TfrmAbout.Create(Application.MainForm); 等但没有运气.
任何有助于此的技巧?
在2009年之前的Delphi(ANSI land)中,您可以使用Ord和Chr将字符转换为字节,反之亦然.这很好,例如当你需要将char作为一个字节操作时:
var
ch: char;
begin
ch:= chr(ord(ch1) xor ord(ch2));
end;
Run Code Online (Sandbox Code Playgroud)
显然,在较新的Delphis中,字符不再是一个字节而是两个字节.那么进行类型转换是否安全:
var
ch: char;
begin
ch:= Char(integer(ch1) xor integer(ch2));
end;
Run Code Online (Sandbox Code Playgroud)
获得相同的结果?到目前为止我所做的测试即使使用西里尔字母和阿拉伯字符也能正常工作,但你永远都不会知道.
我有2张桌子.简化:
表1,用户:
userId int,userName nvarchar(50)
表2,消息:
msgId int,msgFrom int,msgTo int ...
msg1和msg2都包含userId.现在我想获取所有消息,但我想要用户名而不是msgFrom.我知道该怎么做:
select tabMessages.*, tabUsers.userName as Sender
from tabMessages
inner join tabUsers on msgFrom=userId
where msgId = @someParameter;
Run Code Online (Sandbox Code Playgroud)
一切都很好,花花公子.获取用户名而不是msgTo是一样的.现在的问题是,如何在同一个呼叫中获取两个字段?我想得到这张桌子
msgId,msgFrom,msgTo,发件人,收件人.我试过:
select tabMessages.*, tabUsers.userName as Sender,
tabUsers.userName as Recipient
from tabMessages
inner join tabUsers on msgFrom=userId and msgTo=userId
where msgId = @someParameter;
Run Code Online (Sandbox Code Playgroud)
但这不起作用.顺便说一下,我正在使用Ms sql2000.