C++Builder
Начало
Форум
Помощь
Войти
Регистрация
C++Builder
>
Forum
>
Вопросы программирования
>
Общие вопросы программирования в C++Builder
>
неработает процесс
Страниц: [
1
]
Вниз
Печать
Автор
Тема: неработает процесс (Прочитано 7747 раз)
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
неработает процесс
«
:
03 Февраль 2009, 02:28:41 »
Изучаю процессы...
есть класс
Код:
class TMyThread : public TThread
{
private:
protected:
void __fastcall Execute();
public:
AnsiString str;
void __fastcall AddText();
__fastcall TMyThread(bool CreateSuspended);
};
Код:
void __fastcall TMyThread::AddText()
{
Form1->Memo1->Lines->Add(str);
}
void __fastcall TMyThread::Execute()
{
Synchronize(AddText);
}
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMyThread *MyThread;
MyThread = new TMyThread(true);
MyThread->str = "qqqwweewqqwe";
MyThread->Resume();
delete MyThread;
}
насколько я понимаю, методу Execute() управление должно передаться после выполнения команды MyThread->Resume(); ?
но этого непроисходит, и соответствнно в мемо ничего не выводится. Может я неправильно понимаю процесс выполнения TThread...
в инете нету таких примеров на си чтобы в подробностях разобраться, если ктонибудь знает где можно раздобыть боль-мень подробную инфу, пошлите меня туда по ссылке плиз (исключая гугл и пр. поисковики ) или посоветуйте книгу какую-нибудь где это описывается достаточно хорошо. Даже у Страуструпа нету....
спасибо
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #1 :
03 Февраль 2009, 02:33:48 »
по поводу ошибки я поспешил, извините, просто я недождавшись завершения процесса удалил его... втыкнув WaitFor() в нужное место проблемма решилась сама собой
но про инфу вопрос остается открыт
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #2 :
03 Февраль 2009, 04:14:37 »
а что может означать [linker Error]Unresolved External referenced from ?
функция такая существует, модуль подключил...
Записан
IT-IR
Участник
Сказали спасибо: +72/-22
Offline
Сообщений: 877
Плата за вход-Разум!
Re: неработает процесс
«
Ответ #3 :
03 Февраль 2009, 08:16:58 »
скорее всего необходимо дописать #pragma link "файл"
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #4 :
03 Февраль 2009, 13:23:48 »
Цитата: IT-IR от 03 Февраль 2009, 08:16:58
скорее всего необходимо дописать #pragma link "файл"
я тоже так думал, но непомогло...
может я выложу порект, кому не лень посмотрите что там пожалста? только скажите как его выложить, ненайду никак...
Записан
Zor
Глобальный модератор
Сказали спасибо: +158/-30
Offline
Сообщений: 2946
Re: неработает процесс
«
Ответ #5 :
03 Февраль 2009, 13:59:37 »
// кнопка "дополнит опции"
Resume не запускает поток, а помечает его как готовый для запуска. В след раз когда система будет нарезать время задачам, она даст квант времени и этому. Но не ранее чем закончится время у текущего потока (откуда вы и делали Resume)
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #6 :
03 Февраль 2009, 15:45:53 »
Zor, теперь понятно)))
P/S/ вот выкладываю проект, кому не лень, посмотрите пожалста, может еще чего посоветуете - с прочессами в си имею дело второй раз, так что код местами может быть карявым проект только на начальной стадии разработки, я его некомпилировал даже неразу.
спасибо.
«
Последнее редактирование: 03 Февраль 2009, 16:22:39 от Marvin
»
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #7 :
03 Февраль 2009, 17:36:34 »
все, с линкер ерророй покончено, я просто тупо подключил не тот файл, вместо MD5.cpp подключил MD5.h)))
так же разобрался с ошибкой в строке ledtFileHash->Text = GHash->AHash; я просто ненаписал метод который возвращает значение этого свойства)))
З.Ы. как я уже писал, я только начал изучать процессы, и важи замечания/комментарии мне очень важны. прошу прощения за то, что выкладываю неготовый проект, просто хочу продолжить его написание с учетом ваших замечаний. тут я выложу подправленную версию (исправил ошибки о которых писал тут), жду ваших комментарий.
спасибо
Записан
oxotnik
Глобальный модератор
Сказали спасибо: +100/-15
Offline
Сообщений: 2425
Re: неработает процесс
«
Ответ #8 :
03 Февраль 2009, 17:41:38 »
подправить надо бы
void GetSHash(); заменить на
AnsiString GetSHash() {return FHash;};
только для разных файлов один и тот же хэш выводит
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #9 :
03 Февраль 2009, 18:32:28 »
Цитата: oxotnik от 03 Февраль 2009, 17:41:38
подправить надо бы
void GetSHash(); заменить на
AnsiString GetSHash() {return FHash;};
только для разных файлов один и тот же хэш выводит
да, это я уже исправил в моем последнем сообщении выложил
про одинаковые хэши - действительно незаметил, спасибо
oxotnik
.
изменил чтобы в btnGetHashClick создавался экземпляр моего класса и там же по завершению работы удалялся, теперь хэши разные, но почему так? вроде поток завершается к тому времени когда выполняется WaitFor()... а так создавать/удалять его каждый раз при нажатии на кнопку как то "не экономично" получается. есть другой способ решения?
Записан
Zor
Глобальный модератор
Сказали спасибо: +158/-30
Offline
Сообщений: 2946
Re: неработает процесс
«
Ответ #10 :
03 Февраль 2009, 21:24:31 »
"не экономично", зато правильно. Завершенный по WaitFor() поток уже мертвый. Совсем.
К тому же создание потока для системы - милли/микро секунды, а расчет хеша - весьма долгий процесс.
Зачем экономить там где этого делать не надо?
подразумевается так:
Click()
{
создается поток по new()
устанавливаются параметры (файл, тип хеша и тд)
размораживается поток
// механизм ожидания расчета - на совести автора
дождались завершения - считываем результат
удаляется поток.
}
// опять Synchronize - я счаз заплачу
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #11 :
03 Февраль 2009, 21:35:07 »
Цитата: Zor от 03 Февраль 2009, 21:24:31
"не экономично", зато правильно...
теперь понял
Цитата: Zor от 03 Февраль 2009, 21:24:31
// опять Synchronize - я счаз заплачу
Zor, а чем вам Synchronize ненравится?
PS наталкнулся на такую ошибку
есть класс:
Код:
class TGetHash : public TThread
{
private:
...
TStringList *FFileList;
...
void SetFileList(TStringList *list);
protected:
...
__property TStringList *AFileList={read=FFileList , write=SetFileList};
...
void __fastcall Execute();
public:
__fastcall TGetHash(bool CreateSuspended);
__fastcall ~TGetHash();
};
при опсании метода SetFileList возникает ошибка Too few parametres in call to '__fastcall TStrings::Get(int)'
Код:
...
void TGetHash::SetFileList(TStringList *list)
{
FFileList->Strings = list->Strings;
};
...
Записан
Zor
Глобальный модератор
Сказали спасибо: +158/-30
Offline
Сообщений: 2946
Re: неработает процесс
«
Ответ #12 :
03 Февраль 2009, 21:55:12 »
"а чем вам Synchronize ненравится" - нет реальной многозадачности. Практически прямой вызов CalcMDX() из вашей программы, никаких потоков
FFileList->Strings = list->Strings; = Сбой программы во время работы. FFileList не создан
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #13 :
03 Февраль 2009, 23:13:12 »
Цитата: Zor от 03 Февраль 2009, 21:55:12
нет реальной многозадачности. Практически прямой вызов CalcMDX() из вашей программы, никаких потоков
что такое CalcMDX()? в хелпе такого нету, по запросу в гугле ничего ненайдено...
Цитата: Zor от 03 Февраль 2009, 21:55:12
FFileList->Strings = list->Strings; = Сбой программы во время работы. FFileList не создан
нет, не вовремя работы, а на этапе компиляции.
я же создаю FFileList в конструкторе:
Код:
__fastcall TGetHash::TGetHash(bool CreateSuspended)
: TThread(CreateSuspended)
{
FolderName = ExtractFileDrive(Application->ExeName);
FFileList = new TStringList;
FTypeHash = 0;
};
и удаляю его так:
Код:
__fastcall TGetHash::~TGetHash()
{
delete FFileList;
};
неужели неправильно?
Записан
Zor
Глобальный модератор
Сказали спасибо: +158/-30
Offline
Сообщений: 2946
Re: неработает процесс
«
Ответ #14 :
04 Февраль 2009, 00:16:57 »
в архиве ее еще нет правильно перекинуть список:
FFileList->Text = list->Text;
// CalcMDx - подразумевались ваши функции подсчета хеша.
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #15 :
04 Февраль 2009, 02:05:07 »
Цитата: Zor от 04 Февраль 2009, 00:16:57
в архиве ее еще нет правильно перекинуть список:
FFileList->Text = list->Text;
// CalcMDx - подразумевались ваши функции подсчета хеша.
спасибо Zor, все начало работать
PS вот искал по форуму вопос, почему у меня даже с использованием процесса программа виснет если считать хэш большого файла? по идее процесс для того и создан, чтобы иметь доступ к главному окну приложения, и чтобы сохранить его функциональность во время выполнения процесса, на то он и процесс... вобщем ответа ненашол. кто сталкивался (наверня много кто) дайте знать решение этой проблеммы пожалста
Записан
Zor
Глобальный модератор
Сказали спасибо: +158/-30
Offline
Сообщений: 2946
Re: неработает процесс
«
Ответ #16 :
04 Февраль 2009, 02:38:51 »
старенький глухой дедушка повтор:
Synchronize = нет реальной многозадачности. Практически прямой вызов CalcMDX() из вашей программы, никаких потоков
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #17 :
04 Февраль 2009, 03:43:13 »
Цитата: Zor от 04 Февраль 2009, 02:38:51
старенький глухой дедушка повтор:
Synchronize = нет реальной многозадачности. Практически прямой вызов CalcMDX() из вашей программы, никаких потоков
это я понял. но некоторые приложения так делают же под виндой. или они создают новую форму, из нее запускают задачу, прогрессят ее Update()'ами...? тогда какой вообще смысл в процессах?
Записан
Zor
Глобальный модератор
Сказали спасибо: +158/-30
Offline
Сообщений: 2946
Re: неработает процесс
«
Ответ #18 :
04 Февраль 2009, 04:00:13 »
Подсказка - убрать Synchronize? (Да!/Есть!/Так точно!)
В основной программе мониторить завершение потока, затем выводить результат.
// чем проще - тем надежнее.
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #19 :
04 Февраль 2009, 12:34:09 »
гы, синхронайз я убрал после первого вашего поста об его ненужности)))
из проги мониторить завершение потока... а WaitFor() неподойдет?
мне кажется что на зависание проги влияет то что после поток->WaitFor() и прога сама ожидает завершения и ниче неможет больше делать... но убирать WaitFor() бессмысленно, тогда надо поместить его куда-нибудь, где он непомешает.. но куда?
или типо создать еще одну bool переменную в классе потока и менять ее при завершении определеного действия, мне кажется так проще, но первый вариант мне больше нравится если его можно осуществить конечно?
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #20 :
04 Февраль 2009, 14:35:54 »
тут вот какая ошибка еще возникла, в одной функции я использую SelectDirectory():
Код:
#include
...
...
AnsiString Dir;
bool status = SelectDirectory("Укажите папку, файлы из которой будут добавлены на рассчет хэшей", "", Dir);
...
...
все безупречно работало пока я не снял галочки с Project->Options: вкладка Packagest строка Build with runtime packages и вкладка Linker строка Use Dynamic RTL.
теперь при компиляции возникает ошибка [linker Error]Unresolved External '__fastcall Filectrl::SelectDirectory(...)' referenced from .../main.obj
Цитата: IT-IR от 03 Февраль 2009, 08:16:58
скорее всего необходимо дописать #pragma link "файл"
это тоже непомогает
из за чего ошибка возникла, и как ее исправить?
Записан
IT-IR
Участник
Сказали спасибо: +72/-22
Offline
Сообщений: 877
Плата за вход-Разум!
Re: неработает процесс
«
Ответ #21 :
04 Февраль 2009, 14:39:41 »
в Directory укажи папку с obj
Записан
Zor
Глобальный модератор
Сказали спасибо: +158/-30
Offline
Сообщений: 2946
Re: неработает процесс
«
Ответ #22 :
04 Февраль 2009, 15:11:48 »
[linker Error] Unresolved external '__fastcall Filectrl::SelectDirectory(System::AnsiString&, System::Set<:tselectdiropt>, int)' referenced from ...\MAIN.OBJ
A posting from John Moore solves this longtime problem:
The problem is that for some reason, everything in filectrl.hpp is in
vclx50.lib. There are 2 basic ways to fix this:
1) Close your project, edit the .bpr file and add vclx50.lib to the
LIBRARIES and SPARELIBS lines:
2) Add a DriveComboBox (or any other component in filectrl), in the Win 3.1
palette tab, to your form and then delete it. A side effect of doing this
is that vclx50.lib is left in your .bpr file.
вам лучше по методу #2.
WaitFor собственно и тормозит основной поток пока работает другой. отслеживайте готовность таймером, что ли?
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #23 :
04 Февраль 2009, 17:23:10 »
Цитата: Zor от 04 Февраль 2009, 15:11:48
[linker Error] Unresolved external '__fastcall Filectrl::SelectDirectory(System::AnsiString&, System::Set<:tselectdiropt>, int)' referenced from ...\MAIN.OBJ
A posting from John Moore solves this longtime problem:
The problem is that for some reason, everything in filectrl.hpp is in
vclx50.lib. There are 2 basic ways to fix this:
1) Close your project, edit the .bpr file and add vclx50.lib to the
LIBRARIES and SPARELIBS lines:
2) Add a DriveComboBox (or any other component in filectrl), in the Win 3.1
palette tab, to your form and then delete it. A side effect of doing this
is that vclx50.lib is left in your .bpr file.
вам лучше по методу #2.
WaitFor собственно и тормозит основной поток пока работает другой. отслеживайте готовность таймером, что ли?
да, сделал по 2 методу, и все начало рабортать.. почему так?
а при использовании первого метода у меня была Linker Fatal Error, там что то вроде ненайден vclx50.lib...
Цитата: IT-IR от 04 Февраль 2009, 14:39:41
в Directory укажи папку с obj
это где?)))
P/S/ всем спасибо, все работает с таймером ничего несделал пока, но в ближайшем будущем доделаю.
выкладываю проект, может кому-то будет интересно тут же можно посмотреть скриншот. жду ваших замечаний.
Записан
Zor
Глобальный модератор
Сказали спасибо: +158/-30
Offline
Сообщений: 2946
Re: неработает процесс
«
Ответ #24 :
04 Февраль 2009, 17:27:30 »
v2.0 - оптимист. я бы сказал v0.8
Записан
Romzes
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 48
Re: неработает процесс
«
Ответ #25 :
04 Февраль 2009, 23:46:58 »
А что такое хаш, и в чем суть программы??? Я просто не знаю!
Записан
Marvin
Участник
Сказали спасибо: +1/-0
Offline
Сообщений: 298
Re: неработает процесс
«
Ответ #26 :
05 Февраль 2009, 00:07:31 »
Цитата: Zor от 04 Февраль 2009, 17:27:30
v2.0 - оптимист. я бы сказал v0.8
да, поторопился с версией, но пусть будет
Цитата: Romzes от 04 Февраль 2009, 23:46:58
А что такое хаш, и в чем суть программыЯ просто не знаю!
Хеш-суммой (хешем, хеш-образом, хеш-кодом) называется значение хеш-функции. В криптографии хеш-сумму иногда также называют дайджестом сообщения. Значение хеш-суммы может использоваться для проверки целостности данных, а также заменять собой данные, которые небезопасно хранить в явном виде (например, пароли, ответы на вопросы тестов и т.д.)
Явное значение хеш-суммы, как правило, записывается в шестнадцатеричном виде. Так, утилита md5sum, вычисляющая значение хеш-функции MD5 от данного файла, выдает результат в виде строки из 32-х шестнадцатеричных цифр - например, 026f8e459c8f89ef75fa7a78265a0025.
в моей програме я считаю хэш по алгоритму MD5, подробнее здесь http://ru.wikipedia.org/wiki/MD5
википедия рулит
Записан
Страниц: [
1
]
Вверх
Печать
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Вопросы программирования
-----------------------------
=> Общие вопросы программирования в C++Builder
=> Программирование с FMX
=> Работа с базами данных в C++Builder
=> Windows API
=> Технологии COM/DCOM, ActiveX
=> Аспекты и идеология профессиональной разработки ПО
=> Компьютерное железо и системное администрирование
=> студенческий городок
-----------------------------
Обсуждение материалов на сайте
-----------------------------
=> Обсуждений статей на сайте
=> Обсуждение материалов из файлового архива
=> Компоненты сторонних разработчиков к С++Builder
-----------------------------
Работа сайта и новости
-----------------------------
=> Ищу/предлагаю работу
=> Новости из мира программирования
=> Новости - события календаря
=> Голосования
=> Компьютерный юмор и приколы
=> Работа сайта
=> Флейм
-----------------------------
FAQ - частозадаваемые вопросы/ответы
-----------------------------
=> FAQ, общие вопросы, посвящённые C++Builder
=> FAQ, вопросы по базам данных
=> FAQ, вопросы по компонентам
Загружается...