как запустить процедуру в отдельном потоке? необходимо чтобы отдельная процедура программы (архивирование) выполнялась в отдельном потоке, для того чтобы не мешать выполнению самой программы. если Вас не затруднит приведите пример кода. Заранее благодарен.
Ответ отправлен: 26.08.2004, 10:16 Отправитель: Slider Отвечает CrackLab
Доброе время суток, Renard! Используйте класс TThread. Вот я отвечал на похожий вопрос и приводил объяснения и пример на BCB. Думаю переведете на D6: "Поробую объяснить как можно короче и понятнее. Когда вы пытаетесь создать объект класса TThread, вы наверно пишете: TThread *trd = new TThread(); В этом случае компилятор выдаст вам 2 ошибки, сказав, что во-первых, невозможно создать образец абстрактного класса TThread, и во во-вторых, что класс является абстрактным, потому что есть функция, определенная как: __fastcall TThread::Execute() = 0; Функция TThread::Execute() является чистой виртуальной функцией, т.е. не имеет тела (кода) внутри класса TThread. Чистая виртуальная функция объявляется как: ClassName::FuncName(params) = 0; Если в классе есть хотя бы одна виртуальная функция, то такой класс называется абстрактным. Невозможно
создавать объекты абстрактного класса. Необходимо наследовать абстрактный класс, объяв
ить в нем ту функцию, которая в родительском классе является виртуальной, и при необходимости добавить конструктор, передающий параметры конструктору родительского класса. Поэтому мы должны унаследовать свой класс от TThread. В .h файле создадим такой класс: class TDerivedThread : public TThread { void __fastcall Execute(); }; и попытаемся динамически создать объект этого класса: TDerivedThread *trd = new TDerivedThread(); Увидим сообщение об ошибке, что компилятор не может сгенерировать конструктор по умолчанию для объекта класса TDerivedThread Создадим конструктор: class TDerivedThread : public TThread { void __fastcall Execute(); public: TDerivedThread() {}; }; Увидим сообщение об ошибке, что невозможно инициализировать базовый класс TThread. Это происходит потому, что при наследовании и создании объекта, будут вызываться конструкторы
всех базовых классов, начиная со старшего. Т.е. в нашем случае при создании объекта клас
са TDerivedThread будет вызван конструктор классса TThread. Конструктор класса TThread определен как: __fastcall TThread(bool CreateSuspended); Т.е. проблема в том, что он требует параметр bool CreateSuspended. Но при создании класса TDerivedThread мы этот параметр не передаем. Принято соглашение о том, как поступать в этой ситуации. Конструктору "самого дочернего" класса передаются все параметры, необходимые для передачи конструкторам базовых классах, и эти параметры передаются конструкторам базовых классов в такой форме (на примере TThread): TDerivedThread(bool CreateSuspended):TThread(CreateSuspended) { }; Т.е. ставится двоеточие, потом имя базового класса (оно же - имя конструктора базового класса) и в скобках необходимые параметры для передачи, которые берутся из параметров конструктора дочернего класса. После такого объявления конструктора класса
TDerivedThread и динимического создания объекта этого класса: TDerivedThread *trd =
new TDerivedThread(false); Останется только реализовать тело функции Execute(), иначе мы получим ошибку (Linker Error) В теле функции Execute() и напишем код, который будет вызываться конструктором класса TThread (автоматически) и будет выполняться в отдельном потоке. Т.е. остается дописать: void __fastcall TDerivedThread::Execute() { // Наши действия } И программа будет работать. Надеюсь объяснил понятно =)" Ответ отправлен: 22.08.2004, 22:25 Отправитель: CrackLab
Вопрос № 1762
Здравствуйте. Я уже посылал Вам вопрос об отправке письма через NMSMTP. Я понял как отослать HTML-письмо(в виде HTML), но как сделать так, чтобы gif-рисунки в HTML тоже отправлялись? Ведь отправляется только текст в поле NMSMTP1->PostMessage->Body->Text, куда я записываю текст HTML-странички, а как быть с рисунками? Заранее спасибо. Компилятор BuilderC++.
Приветствую Вас, der! попробуй в тексте тегами сделать ссылочки на рисунки.... Ответ отправлен: 26.08.2004, 10:18 Отправитель: Slider
Вопрос № 1763
Здравствуйте. Как можно выполнить авторизацию и вход на почтовый ящик через компонент NMSMTP, чтобы после этого работать с почтовым ящиком(удалять, посылать письма), например на mail.ru? Спасибо.
Ответ отправлен: 26.08.2004, 10:23 Отправитель: Slider
Вопрос № 1764
Здравствуйте Эксперты. Помогите пожалуйста со следующим вопросом по Delphi: Как сохранить элементы двух TreeView в одном файле через FileStream, а потом считать? Я пытался сделать это сам, но не получилось, выдается ошибка. Посмотрите приложение: function TMainForm.TreeLoad(Name: String): Boolean; var fs: TFileStream; begin fs := TFileStream.Create(Name, fmOpenRead); TreeView1.LoadFromStream(fs); TreeView2.LoadFromStream(fs); fs.Free; TreeView1.Items.Item[0].Selected:= true; TreeView1.Items.Item[0].Expand(false); ShowMessage('OK'); end; function TMainForm.TreeSave(Name: String): Boolean; var fs: TFileStream; begin fs := TFileStream.Create(Name, fmcreate); TreeView1.SaveToStream(fs); TreeView1.SaveToStream(fs); fs.Free; end; Основная цель - сохранить все в один
поток. И если можно, как в конец еще добавить считывание и загрузку строки (например S
: Stream)?
Здравствуйте, Trubler! fmOpenRead....ты для чтения открываешь файло... Ответ отправлен: 26.08.2004, 10:30 Отправитель: Slider
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.