Programm reagiert bei Sub ausführung nicht! VB 

  • Ersteller Ersteller eXus49
  • Erstellt am Erstellt am
Status
Für weitere Antworten geschlossen.
E

eXus49

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 :

Code:
Option Explicit

'Ab hier ist das zeuch von CreateThread drinne>>>>
Public Declare Function LoadLibrary Lib "kernel32" Alias _
"LoadLibraryA" (ByVal lpLibFileName As String) As Long

Public Declare Function GetProcAddress Lib "kernel32" _
(ByVal hModule As Long, ByVal lpProcName As String) As _
Long

Public Declare Function WaitForSingleObject Lib "kernel32" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) _
As Long

Public Declare Function CloseHandle Lib "kernel32" (ByVal _
hObject As Long) As Long

Public Declare Function CreateThread Lib "kernel32" _
(lpThreadAttributes As Any, ByVal dwStackSize As Long, _
ByVal lpStartAddress As Long, ByVal lParameter As Long, _
ByVal dwCreationFlags As Long, lpThreadID As Long) As _
Long

Public Declare Function GetExitCodeThread Lib "kernel32" _
(ByVal hThread As Long, lpExitCode As Long) As Long

Public Declare Sub ExitThread Lib "kernel32" (ByVal dwExitCode _
As Long)

Public Declare Function FreeLibrary Lib "kernel32" _
(ByVal hLibModule As Long) As Long

'Und hier heut das Zeug auch schon wieder auf>>>>

Public Declare Function SendMessage Lib "User32" Alias _
"SendMessageA" (ByVal hWnd As Long, ByVal wMsg As _
Long, ByVal wParam As Long, lParam As Any) As Long

Public Declare Sub ReleaseCapture Lib "User32" ()

Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2



Public Declare Function InternetConnect Lib "wininet.dll" Alias _
"InternetConnectA" (ByVal hInternetSession As Long, _
ByVal sServerName As String, ByVal nServerPort As Integer, _
ByVal sUsername As String, ByVal sPassword As String, _
ByVal lService As Long, ByVal lFlags As Long, ByVal _
lContext As Long) As Long

Public Declare Function InternetOpen Lib "wininet.dll" Alias _
"InternetOpenA" (ByVal sAgent As String, ByVal lAccessType _
As Long, ByVal sProxyName As String, ByVal sProxyBypass _
As String, ByVal lFlags As Long) As Long

Public Declare Function InternetCloseHandle Lib "wininet.dll" _
(ByVal hInet As Long) As Integer

Public Declare Function FtpSetCurrentDirectory Lib "wininet.dll" _
Alias "FtpSetCurrentDirectoryA" (ByVal hFtpSession As _
Long, ByVal lpszDirectory As String) As Long

Public Declare Function FtpFindFirstFile Lib "wininet.dll" _
Alias "FtpFindFirstFileA" (ByVal hFtpSession As Long, _
ByVal lpszSearchFile As String, lpFindFileData As _
WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent _
As Long) As Long

Public Declare Function InternetFindNextFile Lib "wininet.dll" _
Alias "InternetFindNextFileA" (ByVal hFind As Long, _
lpvFindData As WIN32_FIND_DATA) As Long

Public Declare Function FtpGetFile Lib "wininet.dll" Alias _
"FtpGetFileA" (ByVal hFtpSession As Long, ByVal _
lpszRemoteFile As String, ByVal lpszNewFile As String, _
ByVal fFailIfExists As Boolean, ByVal dwFlagsAndAttributes _
As Long, ByVal dwFlags As Long, ByVal dwContext As Long) _
As Long

Public Declare Function FtpPutFile Lib "wininet.dll" Alias _
"FtpPutFileA" (ByVal hFtpSession As Long, ByVal _
lpszLocalFile As String, ByVal lpszRemoteFile As String, _
ByVal dwFlags As Long, ByVal dwContext As Long) As Long

Public Declare Function FtpDeleteFile Lib "wininet.dll" _
Alias "FtpDeleteFileA" (ByVal hFtpSession As Long, _
ByVal lpszFileName As String) As Long

Public Declare Function FtpRenameFile Lib "wininet.dll" _
Alias "FtpRenameFileA" (ByVal hFtpSession As Long, _
ByVal lpszFromFileName As String, ByVal lpszToFileName _
As String) As Long

Public Declare Function FtpCreateDirectory Lib "wininet" _
Alias "FtpCreateDirectoryA" (ByVal hFtpSession As _
Long, ByVal lpszDirectory As String) As Long

Public Declare Function FtpRemoveDirectory Lib "wininet" _
Alias "FtpRemoveDirectoryA" (ByVal hFtpSession As _
Long, ByVal lpszDirectory As String) As Long

Public Declare Function InternetGetLastResponseInfo Lib _
"wininet.dll" Alias "InternetGetLastResponseInfoA" _
(lpdwError As Long, ByVal lpszBuffer As String, _
lpdwBufferLength As Long) As Long

Public Declare Function CreateFile Lib "kernel32" _
Alias "CreateFileA" _
(ByVal lpFileName As String, _
ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, _
ByVal lpSecurityAttributes As Long, _
ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, _
ByVal hTemplateFile As Long) _
As Long

Public Declare Function GetFilesize Lib "kernel32" _
Alias "GetFileSize" (ByVal hFile As _
Long, lpFileSizeHigh As _
Long) As Long

Public Declare Function FileTimeToSystemTime Lib "kernel32" _
(lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) _
As Long


Private Const ERROR_NO_MORE_FILES As Long = 18&
Private Const ERROR_INTERNET_EXTENDED_ERROR As Long = 12003&

Private Const FTP_TRANSFER_TYPE_BINARY As Long = &H0&
Private Const FTP_TRANSFER_TYPE_ASCII As Long = &H1&

Private Const INTERNET_FLAG_PASSIVE As Long = &H8000000
Private Const INTERNET_FLAG_RELOAD As Long = &H80000000
Private Const INTERNET_FLAG_KEEP_CONNECTION As Long = &H400000
Private Const INTERNET_FLAG_MULTIPART As Long = &H200000

Private Const INTERNET_OPEN_TYPE_PRECONFIG As Long = 0&
Private Const INTERNET_OPEN_TYPE_DIRECT As Long = 1&
Private Const INTERNET_OPEN_TYPE_PROXY As Long = 3&

Private Const INTERNET_INVALID_PORT_NUMBER As Long = 0&

Private Const INTERNET_SERVICE_FTP As Long = 1&
Private Const INTERNET_SERVICE_GOPHER As Long = 2&
Private Const INTERNET_SERVICE_HTTP As Long = 3&



Private Const MAX_PATH As Long = 260&
Private Const NO_ERROR As Long = 0&
Private Const FILE_ATTRIBUTE_READONLY As Long = &H1&
Private Const FILE_ATTRIBUTE_HIDDEN As Long = &H2&
Private Const FILE_ATTRIBUTE_SYSTEM As Long = &H4&
Private Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10&
Private Const FILE_ATTRIBUTE_ARCHIVE As Long = &H20&
Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80&
Private Const FILE_ATTRIBUTE_TEMPORARY As Long = &H100&
Private Const FILE_ATTRIBUTE_COMPRESSED As Long = &H800&
Private Const FILE_ATTRIBUTE_OFFLINE As Long = &H1000&

Private Const FILE_FLAG_SEQUENTIAL_SCAN = &H8000000

Private Const GENERIC_READ = &H80000000
Private Const FILE_SHARE_READ = &H1
Private Const OPEN_EXISTING = 3

Private Const FTP_UAgent As String = "FTP Demo"

Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type

Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type

Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type



Private FTP_Server As String, FTP_User As String, FTP_PassW As String
Private hOpen As Long, hConnection As Long
Private transfer As Long
Private FileList() As WIN32_FIND_DATA
Private fData As WIN32_FIND_DATA
Private lilist As String



Und das hier ist der Sub:

Code:
Public Sub GetFile(ByVal fDir As String, ByVal fFile As String, ByVal lFile As String, ByVal UseCache As Boolean)
Dim Result As Long
Dim Flags As Long

lFile = lFile & "/" & fFile
Call chFDir(fDir)
MousePointer = vbHourglass
StatusText ("Lade Datei...")

If UseCache Then
Flags = transfer
Else
Flags = transfer Or INTERNET_FLAG_RELOAD
End If

Result = FtpGetFile(hConnection, fFile, lFile, 0, 0, Flags, 0)

Call GetStatus
MousePointer = vbDefault
If Result = 0 Then Call MsgBox("Übertragunsfehler")


End Sub


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
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten