VB的创建的多线程只能创建模块内的public型的过程
但当这个过程中的语句所涉及到的变量与外部过程发生冲突时,就会发生"...内存只能为读"的错误.
例:
'*************
'在一个模块中
private declare function Sleep(.....(省略))  '一个暂停的API函数
public lngTestPara as long
public function newThread()
  Part1:
   lngTestPara=1
   sleep 50
  goto Part1
end function
'**************'**************
'在一个窗体中
private sub Command1_click()
   CreateThread 0,0,Addressof(newThread)  '建立这个新线程   do
      lngTestPara=2      '对这个模块的公用变量不停赋值
   loop
end sub
'***************运行后,不久,内存不可写的错误就发生了
(上述例子在win98下千万不要做测试,容易发生永久死机!!!!!)我只是想向这个线程内传递参数,单这种方法不是很可靠,不知哪位大侠有解决的办法,或者有其它向线程内传递参数的方法告之,谢!

解决方案 »

  1.   

    用Thread Factory for VB6控件来简化多线程编程:http://www.halfx.com/Products.htm#ThreadFactory
      

  2.   

    参考Daniel Appleman写的Creating Multi-Threaded: 
    http://www.china-askpro.com/download/daniel.zip
      

  3.   

    如果是全局变量的话...
    对他的操作,涉及到线程同步的问题,你把他放到 临界区 里 试试.
    Public Declare Sub EnterCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION)  '进入临界区
    Public Declare Sub LeaveCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION)  '离开临界区
    '这个是用于多线程访问临界资源同步Api的数据结构
    Public Type CRITICAL_SECTION
        dummy As Long
    End Type
    Public sect As CRITICAL_SECTIONpublic function newThread()
       .....
       Call EnterCriticalSection(sect)
       ' 上下表示该处为临界区,如果要对工程全局变量做操作,最好在该区域内
       ' 否则线程同步过程中,非常容易让程序崩溃
       lngTestPara=1
       Call LeaveCriticalSection(sect)
    end funciton还有vb的一些控件并非线程安全的,所以在创建的线程内使用也非常危险
      

  4.   

    感谢楼上所给的提示!!!但还有两个问题:
    1.在CRITICAL_SECTION结构中,dummy这个成员如何使用?
    2.我已试过几个控件,它们的确不是安全线程的,您还知道哪些VB控件是安全线程的?谢谢.