Не быстрый метод копирования файлов...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Не быстрый метод копирования файлов...

Сообщение kibernetics » 19.10.2007 (Пт) 10:07

Заметил серьёзную проблему в копировании файлов посредствов АПИ-функции. По сравнение со встроенной виндовой, или даже FSO копируется намного быстрее, нежели:
Код: Выделить всё
Private Sub CopyAllFiles(strDPath As String, bSplash As Boolean)
   
    Dim ret As Long
    Dim lCount As Long
    Dim strNewPath As String
    Dim strOldPath As String
    For lCount = 1 To colPaths.Count
       
        strOldPath = colPaths(lCount)
       
        If bSplash Then
            ret = InStrRev(strOldPath, "\")
            strNewPath = Mid(strOldPath, ret)
            ret = CopyFileEx(strOldPath, strDPath & strNewPath, AddressOf CopyProgressRoutine, ByVal 0&, bCancel, COPY_FILE_RESTARTABLE)
        Else
            strNewPath = Right(strOldPath, Len(strOldPath) - iPath)
            ret = CopyFileEx(strOldPath, strDPath & strNewPath, AddressOf CopyProgressRoutine, ByVal 0&, bCancel, COPY_FILE_RESTARTABLE)
        End If
       
        If ret = 0 Then MsgBox "Ошибка копирования: " & strOldPath
       
        frmMain.ProgressBar1.Value = (lCount / colPaths.Count) * 100
        frmMain.lblCurrFile = strNewPath & ". Файл " & lCount & " из " & colPaths.Count & "     "
    Next
End Sub


Кто знает в чём трамблз?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.10.2007 (Пт) 10:59

Видимо в колбэке тормоза.
Lasciate ogni speranza, voi ch'entrate.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 19.10.2007 (Пт) 11:15

alibek
это лечится?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 19.10.2007 (Пт) 12:13

Естественно, путем лечения коллбэка
Весь мир матрица, а мы в нем потоки байтов!

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 19.10.2007 (Пт) 13:26

Viper
покажи пример.
я чтото недогоняю как его можно вылечить

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 19.10.2007 (Пт) 15:36

Так покажи код коллбэка, посмотрим как лечить
Весь мир матрица, а мы в нем потоки байтов!

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 19.10.2007 (Пт) 17:24

Viper
ты имеешь виду это:
Код: Выделить всё
Public Function CopyProgressRoutine(ByVal TotalFileSize As Currency, _
                                    ByVal TotalBytesTransferred As Currency, _
                                    ByVal StreamSize As Currency, ByVal StreamBytesTransferred As Currency, _
                                    ByVal dwStreamNumber As Long, ByVal dwCallbackReason As Long, _
                                    ByVal hSourceFile As Long, ByVal hDestinationFile As Long, _
                                    ByVal lpData As Long) As Long
    'adjust the caption
    frmMain.ProgressBar2.Value = Int((TotalBytesTransferred * 10000) / (TotalFileSize * 10000) * 100)
    'allow user input
    DoEvents
    'continue filecopy
    CopyProgressRoutine = PROGRESS_CONTINUE
End Function
?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.10.2007 (Пт) 17:43

Ну вот :)

Установка свойства - раз. DoEvents -два. Думай над этими местами.

+ Можно сократить на 10000
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 19.10.2007 (Пт) 18:05

Хакер
но в виндовой функции есть DoEvents, Cancel же работает...

ты хочешь отключить мой прогрессбар?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.10.2007 (Пт) 18:11

В виндовой функции нет DoEvents. DoEvents это сугубо VB-шная штука, которая сильно абстрагирует тебя от того, как всё работает в Windows.

К тому же, я вовсе не заставляю тебя убирать DoEvents. Ты ведь можешь вызывать её, но в сто раз реже, а?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 19.10.2007 (Пт) 18:20

без толку

отключил всё вообще, оставил только
Код: Выделить всё
CopyProgressRoutine = PROGRESS_CONTINUE


медленнее раза в 3, чем в ТоталКомандере, явно там юзается SHLFileOp

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 19.10.2007 (Пт) 19:11

Попробуй вообще убрать калбак. А перед вызовом DoEvents надо бы проверять заполненность очереди сообщений через PeekMessage.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39

    TopList  
cron