forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Как искать идентичные файлы? (http://forum.boolean.name/showthread.php?t=17841)

dsd 21.02.2013 03:32

Ответ: Как искать идентичные файлы?
 
Можно всунуть обновление GUI в конец функции сравнивающей файлы.

ІГРОГРАЙКО 21.02.2013 14:42

Ответ: Как искать идентичные файлы?
 
Вложений: 1
Наконец то разобрался я как создать поток, но тут у меня возникли еще трудности.
При нажатии кнопки "Start" выполняется данный код:
Код:

        public:
                Thread^ processing;
                FileBase^ fileBase;

...

        private: System::Void buttonStart_Click(System::Object^  sender, System::EventArgs^  e) {
                                buttonStart->Enabled = false;
                                resultView->Rows->Clear();
                                array<String^>^ tmp = gcnew array<String^>(directoryList->Items->Count);
                                directoryList->Items->CopyTo(tmp,0);
                                fileBase = gcnew FileBase(tmp, checkboxSearchSubdir->Checked);
                                ThreadStart^ fileBaseDelegate = gcnew ThreadStart(this, &mainForm::DoProcessing);
                                processing = gcnew        Thread(fileBaseDelegate);
                                processing->Start();

                        }

Ну а сам код выполняемой функции:
Код:

        public: void DoProcessing()
                        {
                                progressBar->Value = 0;
                                progressBar->Maximum = fileBase->candidates->Count;
                                for each(KeyValuePair<String^,Int64> iCandidate in fileBase->candidates)
                                {
                                        if (fileBase->IsDuplicate(iCandidate))
                                        resultView->Rows->Add(iCandidate.Key , iCandidate.Value.ToString());
                                        progressBar->Value++;
                                }
                                buttonStart->Enabled = true;
                        }

И сразу же после старта потока вылетает екзепшн:
Вложение 18832

Как лучше всего это обойти?

ІГРОГРАЙКО 21.02.2013 14:52

Ответ: Как искать идентичные файлы?
 
Цитата:

Сообщение от dsd (Сообщение 253372)
Можно всунуть обновление GUI в конец функции сравнивающей файлы.

Не рекомендуется смешивать бизнес-логику и GUI... То есть это плохо когда в классы и методы отвечающие за выполнение логики впихивать код что создает или изменяет GUI. Так делать можно разве что для отладки...

SBJoker 21.02.2013 16:09

Ответ: Как искать идентичные файлы?
 
Вообще когда потоков небыло это решалось банальным sleep 1
Система получает квант времени на перерисовку гуя, но гуй по прежнему не доступен. Зато прогресс-бары обновятся.

ІГРОГРАЙКО 21.02.2013 17:27

Ответ: Как искать идентичные файлы?
 
Цитата:

Сообщение от SBJoker (Сообщение 253405)
Вообще когда потоков небыло это решалось банальным sleep 1
Система получает квант времени на перерисовку гуя, но гуй по прежнему не доступен. Зато прогресс-бары обновятся.

Вот как раз с проблем прорисовкой прогресбара нет. А мне нужно больше! Мне нужен доступ к ГУЮ, а конкретно к его контролам (элементам) с отдельного потока!
Конечно я же могу справиться с екзепшонами наложив try-catch при каждом изменении контролов ГУЯ, но там есть цикл внутри... Так что с быстродействием доведется распрощаться :mad: , да и ревювер не скажет мне что я молодец за это...
:dontknow:


Часовой пояс GMT +4, время: 10:24.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot