НЕЗАВИСАНИЕ во время выполнения

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Master_Zolan
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 07.10.2008 (Вт) 12:11
Откуда: г. Ростов-на-Дону

НЕЗАВИСАНИЕ во время выполнения

Сообщение Master_Zolan » 29.07.2009 (Ср) 11:18

Такой вот вопрос стал. Программка позволяет создавать задания по перетаскиванию файлов. То есть
1 файл туда, второй туда и т.д.

После расстановки всего этого добра нажимаем кнопку "start" и процесс пошел, копирую все это дело как-то так...
viewtopic.php?f=2&t=40407
Естественно что на время выполнения таким вот образом прога падает в глубокий ступор.

Я могу заменить циклы- счетчиками, командами, включенным таймером

Код: Выделить всё
    Public f1n As String
    Public f2n As String
    Public bytesread, blocksize As Integer
    Public bytes(0) As Byte
    Public testf As System.IO.BinaryReader
    Public testf1 As System.IO.BinaryWriter
    Public frazm As Long
    Public k As Long

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        'Копирование
        f1n = TextBox1.Text
        f2n = "C:\rrr.rrr"
        k = 0

        Dim fa = New System.IO.FileInfo(f1n)
        frazm = fa.Length
        ProgressBar1.Maximum = 100
        ProgressBar1.Minimum = 0

        blocksize = 1024 * 100
        ReDim bytes(blocksize - 1)
        Dim ascii = System.Text.Encoding.GetEncoding(0)
        testf = New System.IO.BinaryReader(System.IO.File.Open(f1n, IO.FileMode.Open, IO.FileAccess.Read), ascii)
        testf1 = New System.IO.BinaryWriter(System.IO.File.Open(f2n, IO.FileMode.Create, IO.FileAccess.Write), ascii)

        Timer1.Enabled = True

        Me.Text = k.ToString
    End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Array.Clear(bytes, 0, blocksize)
        bytesread = testf.Read(bytes, 0, blocksize)


        If bytesread = blocksize Then
            testf1.Write(bytes)
            k = k + blocksize
        ElseIf bytesread < blocksize Then
            For i = 0 To bytesread - 1
                testf1.Write(bytes(i))
                k = k + 1
            Next
            'все на закрытие
            testf.Close()
            testf1.Close()
            Timer1.Enabled = False

        End If

        ProgressBar1.Value = (k / frazm) * 100

        Me.Text = k

    End Sub


Она даже с прогрессбаром работает... Но прога намного сложнее приведенной, и она перед копированием смотрит есть ли уже файл с таким именем, если есть, проверяет побайтово оба файла, и если они различны, то рисует ему новое имя, и перед копированием снова проверяет на новое имя. (А дубликаты будут, и много), и как это все на таймер повесить, чтобы куча прогрессбаров бегало я не знаю.

Возникла мысль сделать две программки- одна создает задания и т.д. а при кнопке пуск- задания кидаются в файл, запускается вторая прога в инвизе вытворяет все по моему алгоритму и в процессе пишет файл отчета, давая чтение основной программе и уже основная программа ориентируясь на этот файл рисует скроллбары и т.д.

Но не получится так, что зависшая прога станет в статус "не отвечает" и к чему это может привести с XP и Vista.... или может есть еще какие-то варианты?

Да и не хочется лишний раз к винту обращаться... итак долго и много....

Что скажете? Как это реализуется в антивирусах, даунлоад менеджерах и т.д.... неужто все правда на таймерах и счетчиках?
...или как-то так...

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: НЕЗАВИСАНИЕ во время выполнения

Сообщение MIT » 29.07.2009 (Ср) 11:24

Про многопоточность слышал когда-нибудь? Покопай для начала в сторону BackgroundWorker`а.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: НЕЗАВИСАНИЕ во время выполнения

Сообщение Debugger » 29.07.2009 (Ср) 13:13

Я бы туда же смотрел. Еще всякие Waiter'ы (смотри в кирпичах), API-таймеры и прочее тоже тебе в помощь.

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: НЕЗАВИСАНИЕ во время выполнения

Сообщение Williams » 30.07.2009 (Чт) 18:48

Debugger писал(а):Я бы туда же смотрел. Еще всякие Waiter'ы (смотри в кирпичах), API-таймеры и прочее тоже тебе в помощь.


Ты название раздела смотрел, перед тем как постить?
И вы думаете, что вас оставят в живых после прочтения этого поста?

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: НЕЗАВИСАНИЕ во время выполнения

Сообщение Debugger » 30.07.2009 (Чт) 21:30

Ой. Блин, это в третий раз так.

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: НЕЗАВИСАНИЕ во время выполнения

Сообщение 1Steps » 31.07.2009 (Пт) 2:26

Код: Выделить всё
Public Class Form1

    Dim f As Form

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        For i As Long = 0 To 1000000000
            'Иммитируем копирование файлов
        Next

    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        If f IsNot Nothing Then
            f.Close()
        End If
    End Sub

    Private Sub btnStartCopyFiles_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartCopyFiles.Click
        Me.BackgroundWorker1.RunWorkerAsync()
        'На форму (f) можешь положить прогрессбар или лэйбел для информирования юзера
        f = New Form
        f.ShowDialog()
    End Sub
End Class
Удалена за ненадобностью.


Вернуться в Visual Basic .NET

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

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

    TopList