其实就是我要排列由所有数字及字母可能的十位组合。。从0000000000到ZZZZZZZZZZ。其实我已经VB编写好了。理论上来说没问题。但是一运行很短一段时间,只看到CPU使用率快速上升。。然后就是程序无响应了。这个要怎么解决啊。由于篇幅限制只能用三组代替,十组也类似。如果运行排序到opq就跳到happy处显示OK表示已经排到了opq。主要是解决程序无响应的问题。有没有好的方法啊
Private Sub Command1_Click()
Command1.Enabled = False
Dim sz1(1 To 36), sz2(1 To 36), sz3(1 To 36) As String
dim abc as string
sz1(1) = "0"
sz1(2) = "1"
sz1(3) = "2"
sz1(4) = "3"
sz1(5) = "4"
sz1(6) = "5"
sz1(7) = "6"
sz1(8) = "7"
sz1(9) = "8"
sz1(10) = "9"
sz1(11) = "a"
sz1(12) = "b"
sz1(13) = "c"
sz1(14) = "d"
sz1(15) = "e"
sz1(16) = "f"
sz1(17) = "g"
sz1(18) = "h"
sz1(19) = "i"
sz1(20) = "j"
sz1(21) = "k"
sz1(22) = "l"
sz1(23) = "m"
sz1(24) = "n"
sz1(25) = "o"
sz1(26) = "p"
sz1(27) = "q"
sz1(28) = "r"
sz1(29) = "s"
sz1(30) = "t"
sz1(31) = "u"
sz1(32) = "v"
sz1(33) = "w"
sz1(34) = "x"
sz1(35) = "y"
sz1(36) = "z"
sz2(1) = "0"
sz2(2) = "1"
sz2(3) = "2"
sz2(4) = "3"
sz2(5) = "4"
sz2(6) = "5"
sz2(7) = "6"
sz2(8) = "7"
sz2(9) = "8"
sz2(10) = "9"
sz2(11) = "a"
sz2(12) = "b"
sz2(13) = "c"
sz2(14) = "d"
sz2(15) = "e"
sz2(16) = "f"
sz2(17) = "g"
sz2(18) = "h"
sz2(19) = "i"
sz2(20) = "j"
sz2(21) = "k"
sz2(22) = "l"
sz2(23) = "m"
sz2(24) = "n"
sz2(25) = "o"
sz2(26) = "p"
sz2(27) = "q"
sz2(28) = "r"
sz2(29) = "s"
sz2(30) = "t"
sz2(31) = "u"
sz2(32) = "v"
sz2(33) = "w"
sz2(34) = "x"
sz2(35) = "y"
sz2(36) = "z"
sz3(1) = "0"
sz3(2) = "1"
sz3(3) = "2"
sz3(4) = "3"
sz3(5) = "4"
sz3(6) = "5"
sz3(7) = "6"
sz3(8) = "7"
sz3(9) = "8"
sz3(10) = "9"
sz3(11) = "a"
sz3(12) = "b"
sz3(13) = "c"
sz3(14) = "d"
sz3(15) = "e"
sz3(16) = "f"
sz3(17) = "g"
sz3(18) = "h"
sz3(19) = "i"
sz3(20) = "j"
sz3(21) = "k"
sz3(22) = "l"
sz3(23) = "m"
sz3(24) = "n"
sz3(25) = "o"
sz3(26) = "p"
sz3(27) = "q"
sz3(28) = "r"
sz3(29) = "s"
sz3(30) = "t"
sz3(31) = "u"
sz3(32) = "v"
sz3(33) = "w"
sz3(34) = "x"
sz3(35) = "y"
sz3(36) = "z"
     For K = 1 To 36
       For l = 1 To 36
         For m = 1 To 36
     abc = sz1(K) & sz2(l) & sz3(m)
     If abc = "opq" Then GoTo happy
          Next m
         Next l
     Next K
happy:
Label1.Caption = "ok"
Command1.Enabled = True
End Sub

解决方案 »

  1.   

    本帖最后由 bcrun 于 2010-11-25 23:11:58 编辑
      

  2.   

    1、用完数组用Set 数组名=Nothing释放内存
    2、程序中使用DoEvents交出控制权
      

  3.   

    For...Next 里面加个 Deevents 避免假死机,就你的程序看加在哪一层都差不多。
      

  4.   

    1 不要做字符串连接和比较,很慢的。2 加 DoEvents 防止假死。  For K = 1 To 36
      For l = 1 To 36
      For m = 1 To 36
      
      If K = 25 Then
         If l = 26 Then
            If k = 27 Then GoTo happy
         End If
      End If
      DoEvents  Next m
      Next l
      Next KLabel1.Caption = sz1(K) & sz2(l) & sz3(m)
      

  5.   

    所有数字及字母可能的十位组合这个vb做不来的,大数据量还是用C或者C++吧,实在要用vb做的话,先用计算器算好占多少内存,计算之前就分配好字符串,再用copymemory 估计十位排列,内存占用太惊人了。
      

  6.   

    用这么多FOR...NEXT计算机不慢也怪了
      

  7.   

    来个DyCOMHelper版本的。
    DyCOMHelper可以到这个链接下载
    http://topic.csdn.net/u/20101122/12/9f2a4da0-3010-445a-a33b-7389430f1c87.html?57704
    优点是不生成临时字符串,所有的比较时基于Asc码的。Private Sub Command1_Click()
    Command1.Enabled = False
    Dim sz1()     As Integer
    Dim sz2()     As Integer
    Dim sz3()     As Integer
    Dim oArOwner1 As DyComHelperType.ArrayOwner
    Dim oArOwner2 As DyComHelperType.ArrayOwner
    Dim oArOwner3 As DyComHelperType.ArrayOwner
    Dim s1        As String
    Dim intO      As Integer
    Dim intP      As Integer
    Dim intQ      As Integers1 = "0123456789abcdefghijklmnopqrstuvwxyz"
    Set oArOwner1 = g.Helper.NewArrayOwner(VarPtrArray(sz1), 2, 36, StrPtr(s1))
      '//将数组sz1的指针指向 s1字符串的数据地址,获取0-35位的数组
      '//这样可以按照数组来遍历字符串的ASC码
    Set oArOwner2 = g.Helper.NewArrayOwner(VarPtrArray(sz2), 2, 36, StrPtr(s1))
    Set oArOwner3 = g.Helper.NewArrayOwner(VarPtrArray(sz3), 2, 36, StrPtr(s1))
      intO = Asc("o")
    intP = Asc("p")
    intQ = Asc("q")For K = 0 To 35
     For l = 0 To 35
       For m = 0 To 35
         If sz1(K) = intO Then
            DoEvents
            If sz2(l) = intP Then
              If sz3(m) = intQ Then
                GoTo happy
              End If
            End If
         End If
       Next m
     Next l
    Next K
    happy:
    Label1.Caption = "ok"
    Command1.Enabled = True
    End Sub
      

  8.   

    在退出位置显示的释放 oArOwner1 ,oArOwner3 ,oArOwner3 为Nothing
      

  9.   


    '36^10=3656158440062976
    '3,656,158,440,062,976
    ' P   T   G   M   K