{把中转列表转到使用列表中}
btnRefreshUser.Enabled:=False;
Timer1.Enabled:=False;
是否显示进度条:=True;
stat1.Panels[0].Text:='[状态]用户搜索中......';
Application.ProcessMessages;
//CreateThread(nil,0,@ThreadCheckConnect,nil,0,threadID );
{如果换为线程就会提示application-defined-exception(code 0x0eedfade) at 0x7c812a5b }
ThreadCheckConnect(nil);
Timer1.Enabled:=True;
线程代码为var
i:Integer;
Start:DWORD;
Current:DWORD;
begin
{线程函数}
MainFrm.ProgressBar1.Max:=MainFrm.lsvTransitUser.Items.Count; {设置进度最大值} for I := 0 to MainFrm.lsvTransitUser.Items.Count - 1 do
begin
Application.ProcessMessages;
IP:=MainFrm.lsvTransitUser.Items[I].SubItems.Strings[0];
中转名字:=MainFrm.lsvTransitUser.Items[I].Caption;
MainFrm.ClientSocket2.Active:=False;
MainFrm.ClientSocket2.Address:=IP;
MainFrm.ClientSocket2.Port:=7999;
MainFrm.ClientSocket2.Open;
是否在线:=True;
{设置延时等待连接}
Start:=GetTickCount;
while MainFrm.ClientSocket2.Active=False do
begin
Application.ProcessMessages;
Sleep(10);
Current:=GetTickCount;
if Current - Start > 15000 then
begin
Current:=0;
是否在线:=False;
Break;
end;
end;
Start:=0;
{发送数据}
if 是否在线=True then
begin
MainFrm.ClientSocket2.Socket.SendText('是否在线');
end;
{设置延时等待数据发送}
Start:=GetTickCount;
while 是否在线=True do
begin
Application.ProcessMessages;
Sleep(10);
Current:=GetTickCount;
if Current - Start > 15000 then
begin
Current:=0;
Break;
end;
end;
Start:=0;
Current:=0;
{是否显示进度条}
if 是否显示进度条=true then
begin
MainFrm.ProgressBar1.Position:=MainFrm.ProgressBar1.Position+1; {进度显示}
end;
Application.ProcessMessages;
end;
{搜索完成后对数据设置}
i:=0;
MainFrm.stat1.Panels[0].Text:='[状态]用户搜索完成!';
MainFrm.btnRefreshUser.Enabled:=True;
if MainFrm.ClientSocket2.Active=True then MainFrm.ClientSocket2.Close;
if 是否显示进度条=true then 是否显示进度条:=False;
Result:=1;
因为用的是2010所以用了一些中文变量便于记忆
第一个问题,就是前面注释的那个地方
{//如果换为线程就会提示application-defined-exception(code 0x0eedfade) at 0x7c812a5b }
第二个问题,为什么我编译的时候提示
[DCC Hint] Main.pas(148): H2077 Value assigned to 'Current' never used
[DCC Hint] Main.pas(147): H2077 Value assigned to 'Start' never used
[DCC Hint] Main.pas(128): H2077 Value assigned to 'Start' never used
[DCC Hint] Main.pas(123): H2077 Value assigned to 'Current' never used
[DCC Hint] Main.pas(157): H2077 Value assigned to 'i' never used
解决方案 »
- 求助,急,压缩的BCD码转换为十进制数或着是ascii码
- select ....in select .....解释下什么意思!多谢!!
- delphi的前景
- 大家给点建议吧!
- 还是ADO连接数据库的问题
- 设置背景图片的问题
- TADOConnection.open与close,TADOTable.open与close 会抛出什么异常和错误呢?
- hansonboy(良), 100分,见面礼,笑纳
- 我想要编写一个程序能够检测到当前系统下所有的进程
- 用Mediaplayer播放MP3时,放完一首歌后,如何自动播放另一首或者重复播放?
- 用Delphi做东西,涉及HDC,就是图形之类的,但 编译是老是显示:Undeclared identifier: 'HDC'
- 我一直想知道如何让Delphi生成的默认界面在windows7下显示成win7风格
[DCC Hint] Main.pas(147): H2077 Value assigned to 'Start' never used
[DCC Hint] Main.pas(128): H2077 Value assigned to 'Start' never used
[DCC Hint] Main.pas(123): H2077 Value assigned to 'Current' never used
[DCC Hint] Main.pas(157): H2077 Value assigned to 'i' never used 我都有明确的赋值语句呀,而且在调试运行的时候
Current:=0;
Start:=0;
i:=0;
压根就没有执行,直接跳过
是怎么回事
Current:=0;
Start:=0;
i:=0;
那根蓝色的条条都是直接跳过这些语句的
{//如果换为线程就会提示application-defined-exception(code 0x0eedfade) at 0x7c812a5b }
第二个问题,编译器优化的关系,前面也有人回答了;
不会错,第二次就会报错了
首先,只允许一个线程访问用户界面,大大降低了应用程序的复杂性。...我们不必去注意那些潜在的同步问题...此外,由于VCL只能在一个时刻被一个线程访问,因此在VCL内部就可以不考虑多线程同步问题。这样的应用程序的结构更为简洁,从而有助于提高应用程序的整体效率。
1. 只能在应用程序的主线程中访问VCL的属性和方法。
2. TThread提供了名为Synchronize()的方法,该方法允许在应用程序的主线程内执行线程中的方法。该方法自动实现同步(内部实际上是串行执行)
3. 另外一种技术可以作为 Synchronize() 的替代品,可以使用 SendMessage() 或 PostMessage() 来发送消息到另一个线程环境操纵的窗口。
但是通过Synchronize,可以将子线程要执行代码通过消息传递给主线程,由主线程来执行,这样的话,这段代码就不是子线程代码,而是一般的主线程代码。还是说,我上面这段话的理解跟本上就是错误的。如果没错,那么它就不是多线程了,因为主要的函数还是得由主线程来执行,子线程只负责发送一个消息