有没有其他人有这个问题,或者我的德尔福不知何故被诅咒?
我将在编辑器的选项卡中打开一堆表单和文件,然后我会输入,然后突然一切都停止了 - 我的.pas文件似乎随机变为只读.
有时我可以右键单击顶部的选项卡并取消选中"只读"并继续,但有时会选中此选项并显示为灰色(禁用),这意味着我无法取消选中它并且我无法进行任何操作进一步编辑该文件.这似乎也是随机的.
在后一种情况下,唯一的解决方案是保存有问题的文件,尽管Delphi断言该文件是只读的,在编辑器中关闭其选项卡,然后重新打开它.真的不是灾难性的,但它开始变得烦人.
可能是因为我不小心碰到键盘命令组合这么做或者这是Delphi中的一个错误?
我在Delphi 2010,Windows 7.怀疑它与已安装的软件包有什么关系,但如果有人想要列表,我将生成它并将其附加到此处.
问题说明了一切。尝试增加链接器选项中的堆栈大小会产生错误:
最大堆栈大小必须是65536和16777216之间的整数。
这16MB的限制是Delphi编译器的基本限制,还是IDE施加的任意限制?还有其他增加此值的方法吗?
注意(期待评论...):
我尝试使用streamreader填充字符串列表.但是在填充它时我有一个OutOfMemoryError.我在网上搜索,但找到任何解决方案.我也尝试增加我的字符串列表的容量,但它没有任何改变.谢谢你的帮助.
这是我的代码:
list := TStringList.create;
//list.Capacity := 100000000; Doesn't work
Reader := TStreamReader.Create(filename, true);
try
list.BeginUpdate;
try
list.Clear;
while not Reader.EndOfStream do
list.Add(Reader.ReadLine); // OutOfMemoryError
finally
list.EndUpdate;
end;
finally
Reader.Free;
end;
Run Code Online (Sandbox Code Playgroud)
我忘了我的xml文件大小是250个月.
保存表单或单元时,表单或单元的创建日期将更新为修改时。修改的日期按预期更改,但是创建的日期也更改。为什么修改时间没有专门更新?
处理计算量大的任务的常用 VB 方法是将其放入后台工作线程,而主线程继续处理 UI。
不管出于什么原因,我需要以相反的方式执行此操作:主线程执行繁重的工作,后台线程更新 UI。
这是我到目前为止所拥有的。唯一的问题是,虽然 UI 窗口 (Form1) 确实被重绘,但您无法与其交互,甚至无法移动它或调整其大小(鼠标光标变成沙漏状并且无法单击)。
Public Class ProgressDisplay
Private trd As Thread
Public Sub New()
trd = New Thread(AddressOf threadtask)
trd.Start()
End Sub
Private Sub threadtask()
Dim f1 As Form1
f1 = New Form1
f1.Show()
Do
f1.Update()
Thread.Sleep(100)
Loop
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
编辑:理想情况下,我需要向客户端呈现这样的界面
Public Class ProgressDisplay
Public Sub New()
Public Sub Update(byval progress as int)
End Class
Run Code Online (Sandbox Code Playgroud)
客户端将像这样调用它(实际上是在 COM 上的非托管 c++ 中,但你明白了):
Dim prog = new ProgressDisplay()
DoLotsOfWork(addressof prog.update) ' DoLotsOfWork method takes …Run Code Online (Sandbox Code Playgroud) vb.net multithreading message-pump ui-thread applicationcontext
我\xc2\xb4m是Delphi的新手,我\xc2\xb4m尝试进行一些网络操作。在本例中,我想连接到(让\xc2\xb4s 称之为)通知服务器,该服务器将在发生某些事件时发送字符串。
\n\n我的第一种方法是这样的:\n我在自己的线程上运行 TIdTCPClient 并设置 ReadTimeout,这样我\xc2\xb4m 就不会总是被阻塞。这样我可以检查线程的终止状态。
\n\nConnectionToServer.ReadTimeout := MyTimeOut;\nwhile( Continue ) do\nbegin\n //\n try\n Command := ConnectionToServer.ReadLn( );\n except\n on E: EIdReadTimeout do\n begin\n //AnotarMensaje(odDepurar, 'Timeout ' + E.Message );\n end;\n on E: EIdConnClosedGracefully do\n begin\n AnotarMensaje(odDepurar, 'Conexi\xc3\xb3n cerrada ' + E.Message );\n Continue := false;\n end;\n on E: Exception do\n begin\n AnotarMensaje(odDepurar, 'Error en lectura ' + E.Message );\n Continue := false;\n end;\n end;\n // treat the command\n ExecuteRemoteCommand( Command ); \n if( self.Terminated ) then\n …Run Code Online (Sandbox Code Playgroud) 需要在TComboBox中添加许多项目(超过10k)(我知道TComboBox不应该包含很多项目,但不能由我来改变它)而不添加重复项.所以我需要在添加之前搜索完整列表.我想避免使用TComboBox.items.indexof,因为我需要二进制搜索,但二进制查找在TStrings中不可用.
所以我创建了一个临时的Tstringlist,设置排序为true并使用find.但现在将临时Tstringlist分配回TComboBox.Items
(myCB.Items.AddStrings(myList))
Run Code Online (Sandbox Code Playgroud)
复制整个列表真的很慢.有没有办法移动列表而不是复制它?或者以其他方式高效填充我的TComboBox?
我对装配很新,并且有一些非常基本的问题.
这四个命令有什么区别?
mov ebx, eax
mov [ebx], eax
mov ebx, [eax]
mov [ebx], [eax]
Run Code Online (Sandbox Code Playgroud)
他们说括号的意思是"得到地址的价值".但那么,第一线真正做到了什么呢?它不会将eax的价值转移到ebx吗?如果是这样,那么括号的重点是什么?
没有Get被重载(仅使用第一个定义Get),否则编译好了:
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils, Classes;
type
TxALNameValuePair = record
Name: ansistring;
Value: ansistring;
constructor Create(const AName, AValue: ansistring);
end;
TxALNameValueArray = TArray<TxALNameValuePair>;
TxALHTTPClient = class(TObject)
private
protected
public
Function Get(const aUrl:AnsiString;
const ARequestHeaderValues: TxALNameValueArray = nil): AnsiString; overload;
Function Get(const aUrl:AnsiString;
const aRequestFields: TStrings;
const aEncodeRequestFields: Boolean=True;
const ARequestHeaderValues: TArray<TxALNameValuePair> = nil): AnsiString; overload;
end;
constructor TxALNameValuePair.Create(const AName, AValue: ansiString);
begin
Name := AName;
Value := AValue;
end;
function TxALHTTPClient.Get(const aUrl: AnsiString;
const …Run Code Online (Sandbox Code Playgroud) 以下代码最低限度地演示了该问题.在后台线程中,我创建一个有效的句柄数组并将其传递给,WaitForMultipleObjects并成功等待对象.
MsgWaitForMultipleObjects但是,当传递完全相同的数组时,函数调用failed(WAIT_FAILED)with ERROR_INVALID_HANDLE.
我究竟做错了什么?
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows, SyncObjs, Classes;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
procedure TMyThread.Execute;
var
LEvent : TEvent;
LWaitHandles : TWOHandleArray;
LPWaitHandles : PWOHandleArray;
LWaitResult : Cardinal;
begin
LEvent := TEvent.Create;
LWaitHandles[0] := LEvent.Handle;
LPWaitHandles := @LWaitHandles;
while not Terminated do begin
{Works -> LWaitResult := WaitForMultipleObjects(1, LPWaitHandles, false, INFINITE);}
{Fails ->} LWaitResult := MsgWaitForMultipleObjects(1, LPWaitHandles, false, INFINITE, QS_ALLINPUT);
case LWaitResult of
WAIT_OBJECT_0: WriteLn('Event …Run Code Online (Sandbox Code Playgroud) delphi ×8
assembly ×1
asynchronous ×1
combobox ×1
delphi-2010 ×1
delphi-xe2 ×1
delphi-xe3 ×1
editor ×1
indy ×1
intel-syntax ×1
memory ×1
message-pump ×1
stack-size ×1
ui-thread ×1
vb.net ×1
winapi ×1
x86 ×1