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]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.052 секунд. Запросов: 22.