Programm reagiert bei Sub ausführung nicht!

  • VB

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Programm reagiert bei Sub ausführung nicht!

    Hey,
    ich hab ein Problem und zwar hab ich ein Programm geschrieben,das Dateien von einem FTP-Server Laden kann (nen FTP-Client)! So, wenn er die Datei allerdings runterlädt (is alles 1 Sub mit dem Download), reagiert das Programm nicht mehr und wenn er dann fertig ist, dann reagiert es wieder, bei größeren Dateien kann das ja dann durchaus nervig werden, wenn man z.B. schauen will, wie weit man bereits is, und wenn alles nicht reagiert, sieht man auch wenig ;)

    Und dann noch ne Frage, die aba nich so wichtig ist: Wisst ihr wie ich dir Geschwindigkeit messen kann, mit der ich Downloade? Ich lade mit der Wininet.dll (ich glaub die is vom I-Explorer) von dem FTP-Server!

    Vielen Dank für eure Hilfe,
    mFg
    eXus49
  • Lagere das am besten in einen seperaten Thread aus, dann kann man weiterhin auf das GUI zugreifen.
    Schlag mal CreateThread(...) im MSDN nach.
    (Ich geh jetzt einfach mal ganz dreist davon aus dass du für windows programmierst)
  • Ja, ich progge unter Win mit VB6!
    Hmm.. ich versteh das mit CreateThread nicht so... irgendwie finde ich nur beispiele um DLL's mit CreateThread zu verwenden!?

    Kann mit plz einer helfen?

    mFg
    eXus49
  • Hmm, mit Visual Basic (insbesondere 6.0) ist das so eine Sache,
    man kann zwar, wie hier beschrieben mit CreateThread arbeiten, andererseits wird hier erklärt warum man es auf jedenfall vermeiden sollte.
    Multithreading ist in VB 6.0 eigentlich nur über einen Umweg mit ActiveX "sicher" machbar, ob dein Problem anders zu lösen ist (abgesehen davon keine sub zu verwenden) weiss ich nicht.
    Naja, ein Grund (mehr) warum VB suckt ;)
  • Hmmm also muss ich das alles in ne Public Function in en Modul einfügen!?
    Ich kann aber nicht alle deklarartionen Public machen!?
    Ich glaub an dem Punkt komm ich an miene Grenzen ;)

    Das sind alle Zeilen :

    Quellcode

    1. Option Explicit
    2. 'Ab hier ist das zeuch von CreateThread drinne>>>>
    3. Public Declare Function LoadLibrary Lib "kernel32" Alias _
    4. "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    5. Public Declare Function GetProcAddress Lib "kernel32" _
    6. (ByVal hModule As Long, ByVal lpProcName As String) As _
    7. Long
    8. Public Declare Function WaitForSingleObject Lib "kernel32" _
    9. (ByVal hHandle As Long, ByVal dwMilliseconds As Long) _
    10. As Long
    11. Public Declare Function CloseHandle Lib "kernel32" (ByVal _
    12. hObject As Long) As Long
    13. Public Declare Function CreateThread Lib "kernel32" _
    14. (lpThreadAttributes As Any, ByVal dwStackSize As Long, _
    15. ByVal lpStartAddress As Long, ByVal lParameter As Long, _
    16. ByVal dwCreationFlags As Long, lpThreadID As Long) As _
    17. Long
    18. Public Declare Function GetExitCodeThread Lib "kernel32" _
    19. (ByVal hThread As Long, lpExitCode As Long) As Long
    20. Public Declare Sub ExitThread Lib "kernel32" (ByVal dwExitCode _
    21. As Long)
    22. Public Declare Function FreeLibrary Lib "kernel32" _
    23. (ByVal hLibModule As Long) As Long
    24. 'Und hier heut das Zeug auch schon wieder auf>>>>
    25. Public Declare Function SendMessage Lib "User32" Alias _
    26. "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As _
    27. Long, ByVal wParam As Long, lParam As Any) As Long
    28. Public Declare Sub ReleaseCapture Lib "User32" ()
    29. Const WM_NCLBUTTONDOWN = &HA1
    30. Const HTCAPTION = 2
    31. Public Declare Function InternetConnect Lib "wininet.dll" Alias _
    32. "InternetConnectA" (ByVal hInternetSession As Long, _
    33. ByVal sServerName As String, ByVal nServerPort As Integer, _
    34. ByVal sUsername As String, ByVal sPassword As String, _
    35. ByVal lService As Long, ByVal lFlags As Long, ByVal _
    36. lContext As Long) As Long
    37. Public Declare Function InternetOpen Lib "wininet.dll" Alias _
    38. "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType _
    39. As Long, ByVal sProxyName As String, ByVal sProxyBypass _
    40. As String, ByVal lFlags As Long) As Long
    41. Public Declare Function InternetCloseHandle Lib "wininet.dll" _
    42. (ByVal hInet As Long) As Integer
    43. Public Declare Function FtpSetCurrentDirectory Lib "wininet.dll" _
    44. Alias "FtpSetCurrentDirectoryA" (ByVal hFtpSession As _
    45. Long, ByVal lpszDirectory As String) As Long
    46. Public Declare Function FtpFindFirstFile Lib "wininet.dll" _
    47. Alias "FtpFindFirstFileA" (ByVal hFtpSession As Long, _
    48. ByVal lpszSearchFile As String, lpFindFileData As _
    49. WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent _
    50. As Long) As Long
    51. Public Declare Function InternetFindNextFile Lib "wininet.dll" _
    52. Alias "InternetFindNextFileA" (ByVal hFind As Long, _
    53. lpvFindData As WIN32_FIND_DATA) As Long
    54. Public Declare Function FtpGetFile Lib "wininet.dll" Alias _
    55. "FtpGetFileA" (ByVal hFtpSession As Long, ByVal _
    56. lpszRemoteFile As String, ByVal lpszNewFile As String, _
    57. ByVal fFailIfExists As Boolean, ByVal dwFlagsAndAttributes _
    58. As Long, ByVal dwFlags As Long, ByVal dwContext As Long) _
    59. As Long
    60. Public Declare Function FtpPutFile Lib "wininet.dll" Alias _
    61. "FtpPutFileA" (ByVal hFtpSession As Long, ByVal _
    62. lpszLocalFile As String, ByVal lpszRemoteFile As String, _
    63. ByVal dwFlags As Long, ByVal dwContext As Long) As Long
    64. Public Declare Function FtpDeleteFile Lib "wininet.dll" _
    65. Alias "FtpDeleteFileA" (ByVal hFtpSession As Long, _
    66. ByVal lpszFileName As String) As Long
    67. Public Declare Function FtpRenameFile Lib "wininet.dll" _
    68. Alias "FtpRenameFileA" (ByVal hFtpSession As Long, _
    69. ByVal lpszFromFileName As String, ByVal lpszToFileName _
    70. As String) As Long
    71. Public Declare Function FtpCreateDirectory Lib "wininet" _
    72. Alias "FtpCreateDirectoryA" (ByVal hFtpSession As _
    73. Long, ByVal lpszDirectory As String) As Long
    74. Public Declare Function FtpRemoveDirectory Lib "wininet" _
    75. Alias "FtpRemoveDirectoryA" (ByVal hFtpSession As _
    76. Long, ByVal lpszDirectory As String) As Long
    77. Public Declare Function InternetGetLastResponseInfo Lib _
    78. "wininet.dll" Alias "InternetGetLastResponseInfoA" _
    79. (lpdwError As Long, ByVal lpszBuffer As String, _
    80. lpdwBufferLength As Long) As Long
    81. Public Declare Function CreateFile Lib "kernel32" _
    82. Alias "CreateFileA" _
    83. (ByVal lpFileName As String, _
    84. ByVal dwDesiredAccess As Long, _
    85. ByVal dwShareMode As Long, _
    86. ByVal lpSecurityAttributes As Long, _
    87. ByVal dwCreationDisposition As Long, _
    88. ByVal dwFlagsAndAttributes As Long, _
    89. ByVal hTemplateFile As Long) _
    90. As Long
    91. Public Declare Function GetFilesize Lib "kernel32" _
    92. Alias "GetFileSize" (ByVal hFile As _
    93. Long, lpFileSizeHigh As _
    94. Long) As Long
    95. Public Declare Function FileTimeToSystemTime Lib "kernel32" _
    96. (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) _
    97. As Long
    98. Private Const ERROR_NO_MORE_FILES As Long = 18&
    99. Private Const ERROR_INTERNET_EXTENDED_ERROR As Long = 12003&
    100. Private Const FTP_TRANSFER_TYPE_BINARY As Long = &H0&
    101. Private Const FTP_TRANSFER_TYPE_ASCII As Long = &H1&
    102. Private Const INTERNET_FLAG_PASSIVE As Long = &H8000000
    103. Private Const INTERNET_FLAG_RELOAD As Long = &H80000000
    104. Private Const INTERNET_FLAG_KEEP_CONNECTION As Long = &H400000
    105. Private Const INTERNET_FLAG_MULTIPART As Long = &H200000
    106. Private Const INTERNET_OPEN_TYPE_PRECONFIG As Long = 0&
    107. Private Const INTERNET_OPEN_TYPE_DIRECT As Long = 1&
    108. Private Const INTERNET_OPEN_TYPE_PROXY As Long = 3&
    109. Private Const INTERNET_INVALID_PORT_NUMBER As Long = 0&
    110. Private Const INTERNET_SERVICE_FTP As Long = 1&
    111. Private Const INTERNET_SERVICE_GOPHER As Long = 2&
    112. Private Const INTERNET_SERVICE_HTTP As Long = 3&
    113. Private Const MAX_PATH As Long = 260&
    114. Private Const NO_ERROR As Long = 0&
    115. Private Const FILE_ATTRIBUTE_READONLY As Long = &H1&
    116. Private Const FILE_ATTRIBUTE_HIDDEN As Long = &H2&
    117. Private Const FILE_ATTRIBUTE_SYSTEM As Long = &H4&
    118. Private Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10&
    119. Private Const FILE_ATTRIBUTE_ARCHIVE As Long = &H20&
    120. Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80&
    121. Private Const FILE_ATTRIBUTE_TEMPORARY As Long = &H100&
    122. Private Const FILE_ATTRIBUTE_COMPRESSED As Long = &H800&
    123. Private Const FILE_ATTRIBUTE_OFFLINE As Long = &H1000&
    124. Private Const FILE_FLAG_SEQUENTIAL_SCAN = &H8000000
    125. Private Const GENERIC_READ = &H80000000
    126. Private Const FILE_SHARE_READ = &H1
    127. Private Const OPEN_EXISTING = 3
    128. Private Const FTP_UAgent As String = "FTP Demo"
    129. Private Type FILETIME
    130. dwLowDateTime As Long
    131. dwHighDateTime As Long
    132. End Type
    133. Private Type WIN32_FIND_DATA
    134. dwFileAttributes As Long
    135. ftCreationTime As FILETIME
    136. ftLastAccessTime As FILETIME
    137. ftLastWriteTime As FILETIME
    138. nFileSizeHigh As Long
    139. nFileSizeLow As Long
    140. dwReserved0 As Long
    141. dwReserved1 As Long
    142. cFileName As String * MAX_PATH
    143. cAlternate As String * 14
    144. End Type
    145. Private Type SYSTEMTIME
    146. wYear As Integer
    147. wMonth As Integer
    148. wDayOfWeek As Integer
    149. wDay As Integer
    150. wHour As Integer
    151. wMinute As Integer
    152. wSecond As Integer
    153. wMilliseconds As Integer
    154. End Type
    155. Private FTP_Server As String, FTP_User As String, FTP_PassW As String
    156. Private hOpen As Long, hConnection As Long
    157. Private transfer As Long
    158. Private FileList() As WIN32_FIND_DATA
    159. Private fData As WIN32_FIND_DATA
    160. Private lilist As String
    Alles anzeigen




    Und das hier ist der Sub:

    Quellcode

    1. Public Sub GetFile(ByVal fDir As String, ByVal fFile As String, ByVal lFile As String, ByVal UseCache As Boolean)
    2. Dim Result As Long
    3. Dim Flags As Long
    4. lFile = lFile & "/" & fFile
    5. Call chFDir(fDir)
    6. MousePointer = vbHourglass
    7. StatusText ("Lade Datei...")
    8. If UseCache Then
    9. Flags = transfer
    10. Else
    11. Flags = transfer Or INTERNET_FLAG_RELOAD
    12. End If
    13. Result = FtpGetFile(hConnection, fFile, lFile, 0, 0, Flags, 0)
    14. Call GetStatus
    15. MousePointer = vbDefault
    16. If Result = 0 Then Call MsgBox("Übertragunsfehler")
    17. End Sub
    Alles anzeigen



    Kann sein dasn paar Teile zu viel / überflüssig sind... ist alles noch nciht so geordnet! ;)



    Hmm.. :confused:


    mFg
    eXus49
  • Nur deine Download Funktion muss Public sein, allerdings muss das ganze dafür noch etwas umstrukturiert werden, zunächst einmal darf/muss deine Funktion als einzigen Parameter "ByVal lpParam As Long" übernehmen.
    Was übergeben wird kannst du über den CreateThread Parameter lpParameter festlegen.
    Ich weiss nicht inwiefern VB Pointer unterstützt, aber es wäre am besten wenn du die eigentlich benötigten Parameter in einer Struktur kapselst und dann einen Pointer darauf an die Funktion übergibst.
    (Oder du deklariest diese Global)
    Naja, allerdings wie gesagt: CreateThread ist in VB6 mit Vorsicht zu genießen.
  • Also wenn das Programm nicht reagiert, dann liegt es daran, dass dein Programm erst die Befehle ab arbeitet und dann ers wieder auf Benutzereingaben reagiert. Mit dem Befehl DoEvents zwingst du das Programm Benutzereingaben entgegen zu nehmen....denk ma das wird dir helfen
  • underscare schrieb:

    Also wenn das Programm nicht reagiert, dann liegt es daran, dass dein Programm erst die Befehle ab arbeitet und dann ers wieder auf Benutzereingaben reagiert. Mit dem Befehl DoEvents zwingst du das Programm Benutzereingaben entgegen zu nehmen....denk ma das wird dir helfen


    stimmt genau ,

    eXus49
    bzw. schaue mal deine cpu an wie arg die ausgelastet ist ,baue hier dann ein sleep ein .

    um die übertragungsgeschwindikeit zu messen kannst du eine schleife einbauen , am besten ich schicke dir was per pn habe das auch schon mal gemacht mit dem inetcontroll kannst dir mal anschauen das funzt 100% tig