{把中转列表转到使用列表中}
  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

解决方案 »

  1.   

    [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 我都有明确的赋值语句呀,而且在调试运行的时候
    Current:=0;
    Start:=0;
    i:=0;
    压根就没有执行,直接跳过
    是怎么回事
      

  2.   

    关键是我在调试程序的时候压根就不执行这些语句啊,
    Current:=0; 
    Start:=0; 
    i:=0; 
    那根蓝色的条条都是直接跳过这些语句的
      

  3.   

    先把编译器优化全部关掉,然后再编译试试,Delphi编译器默认会清理未使用的变量
      

  4.   

    关于优化我明天去单位会试试的,那么这个呢第一个问题,就是前面注释的那个地方 
    {//如果换为线程就会提示application-defined-exception(code 0x0eedfade) at 0x7c812a5b } 
      

  5.   

    第一个问题,应该是你的子线程直接操作 VCL的缘故;
    第二个问题,编译器优化的关系,前面也有人回答了;
      

  6.   

    子线程就不可以操作VCL吗,似乎没看到过这种说法呀
      

  7.   

    而且第一次经过CreateThread(nil,0,@ThreadCheckConnect,nil,0,threadID );
    不会错,第二次就会报错了
      

  8.   

    你没理解我的意思因为你是直接用API挂上自己的函数,你要知道VCL线程安全问题!若你用TThread,同样也需要Sync
      

  9.   

    为什么不用TThread? 它有提供sync方法
      

  10.   

    ...任何访问或修改应用程序界面的代码都应该在应用程序的主线程环境中执行。这种机制的缺陷是显然的,不过表面上看上去这种机制有一定的局限性,实际上还是有一点优势的。...   
      首先,只允许一个线程访问用户界面,大大降低了应用程序的复杂性。...我们不必去注意那些潜在的同步问题...此外,由于VCL只能在一个时刻被一个线程访问,因此在VCL内部就可以不考虑多线程同步问题。这样的应用程序的结构更为简洁,从而有助于提高应用程序的整体效率。   
        
      1.   只能在应用程序的主线程中访问VCL的属性和方法。   
      2.   TThread提供了名为Synchronize()的方法,该方法允许在应用程序的主线程内执行线程中的方法。该方法自动实现同步(内部实际上是串行执行)   
      3.   另外一种技术可以作为   Synchronize()   的替代品,可以使用   SendMessage()   或   PostMessage()   来发送消息到另一个线程环境操纵的窗口。 
    但是通过Synchronize,可以将子线程要执行代码通过消息传递给主线程,由主线程来执行,这样的话,这段代码就不是子线程代码,而是一般的主线程代码。还是说,我上面这段话的理解跟本上就是错误的。如果没错,那么它就不是多线程了,因为主要的函数还是得由主线程来执行,子线程只负责发送一个消息
      

  11.   

    不能这么理解,只是在操作VCL时,临时交给主线程处理。所以,子线程要尽量避免去操作VCl 或者 能与主线程分开的就分开...