Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки, Билдер, формы и их взаимодействие, Access violation at address.... 
V
    Опции темы
Bunny
Дата 20.8.2006, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 22.3.2006

Репутация: 1
Всего: 1



Цитата

эта ф-ция без потока вообще работает?

работает, я об этом уже писал, и во время работы этой функции вся форма недоступна.

PM MAIL ICQ   Вверх
_hunter
Дата 21.8.2006, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



еще код LoadFilesInList() показать не помешалобы...
+ ты о такой полезной штуке как отладчик слышал?
++ ты ссылку Romikgy похоже не читал потому как смысла в этом коде (точнее использования тут потоков) я не вижу...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Romikgy
Дата 21.8.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Цитата(_hunter @  21.8.2006,  10:08 Найти цитируемый пост)
ты ссылку Romikgy похоже не читал потому как смысла в этом коде 


_hunter, о какой ссылке речь ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
_hunter
Дата 21.8.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98





--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bunny
Дата 21.8.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 22.3.2006

Репутация: 1
Всего: 1



Господин, _hunter.
Смысл использования потоков здесь ясен, я даже объяснял зачем он мне тут нужен, и код функции LoadFilesInList() уже приведен выше => делаю вывод, что это Вы не вникаете в тему и не читаете то, что тут уже написано! И свои "замечания" по поводу отладчика оставьте, пожалуйста, у себя.
PM MAIL ICQ   Вверх
Romikgy
Дата 21.8.2006, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146





Цитата(Bunny @  16.8.2006,  19:40 Найти цитируемый пост)
 ResultsImportForm->LoadFilesInList(".");

почему точка а не *?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
_hunter
Дата 21.8.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



Цитата(Bunny @  21.8.2006,  11:34 Найти цитируемый пост)
Смысл использования потоков здесь ясен

дык просвети меня темного...
точнее приведи контр-аргумент к следующей фразе: метод, вызываемый Synchronize() выполняется в основном потоке VCL. откуда вывод: приведенный код полностью аналогичен коду, в котором вызов ResultsImportForm->LoadFilesInList("."); происхоит из обработчика нажатия на какую-нить кнопку...

насчет "код функции приведен выше": я считаю что весь код, относящийся к проблеме должен находиться в одном месте. и искать его по двум страницам (или помнить что в этой теме писалось н дней назад) у меня желания нет.

по поводу  "замечания по поводу отладчика" еслибы ты четко указал строку, вызывающую ошибку -- никаких претензий небылобы...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bunny
Дата 21.8.2006, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 22.3.2006

Репутация: 1
Всего: 1



_hunter, строку, вызывающую ошибку я указал
Код

            if (GetFileExtention(FileName) == "dat")
            {
                /*ТУТ И ВЫЛАЗЕЕТ ОШИБКА!*/  
                ResultFilesList->Items->Add();
                int count = ResultFilesList->Items->Count;
                ResultFilesList->Items->Item[count-1]->Caption = count;
                ResultFilesList->Items->Item[count-1]->SubItems->Add("");
                ResultFilesList->Items->Item[count-1]->SubItems->
                    Add(AnsiString(CurrPath)+"\\"+FileName);
                ResultFilesList->Items->Item[count-1]->SubItems->Add(IntToStr(count) + "0");
            }

Romikgy, "." - поиск в текущем каталоге.
Перенес функции поиска и добавления файлов в список в сам класс потока:
Код

//---------------------------------------------------------------------------

#ifndef LoadThreadUnitH
#define LoadThreadUnitH
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class TLoadThread : public TThread
{
private:
    void LoadFilesInList(LPCTSTR PathName);
    DWORD FileType(LPWIN32_FIND_DATA pFileData);
    AnsiString GetFileExtention(AnsiString FileName);
    AnsiString m_strCurrPath;
    AnsiString m_strFileName;
protected:
    void __fastcall Execute();
public:
    __fastcall TLoadThread(bool CreateSuspended = false);
    void __fastcall UpdateList();
};
//---------------------------------------------------------------------------
#endif

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "LoadThreadUnit.h"
#include "ResultsImportUnit.h"
#pragma package(smart_init)

#define TYPE_FILE 1
#define TYPE_DIR 2
#define TYPE_DOT 3
//---------------------------------------------------------------------------

//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall TLoadThread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------

__fastcall TLoadThread::TLoadThread(bool CreateSuspended)
    : TThread(CreateSuspended)
{
    FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall TLoadThread::Execute()
{
    LoadFilesInList(".");
    return;
}
//---------------------------------------------------------------------------
void TLoadThread::LoadFilesInList(LPCTSTR PathName)
{
    HANDLE SearchHandle;
    WIN32_FIND_DATA FindData;
    DWORD FType;
    TCHAR CurrPath[256];

    int pos = GetCurrentDirectory(255, CurrPath);
    CurrPath[pos+1] = NULL;

    SearchHandle = FindFirstFile(PathName, &FindData);
    do
    {
        FType = FileType(&FindData);
        if (FType == TYPE_FILE)
        {
            AnsiString FileName = AnsiString(FindData.cFileName);
            if (GetFileExtention(FileName) == "dat")
            {          
                m_strCurrPath = AnsiString(CurrPath);
                m_strFileName = FileName;

/*Ошибка осталась здесь же :((*/

                Synchronize(UpdateList);
            }

        }
        else if (FType == TYPE_DIR)
        {
            SetCurrentDirectory(FindData.cFileName);
            LoadFilesInList("*");
            SetCurrentDirectory("..");
        }
    }
    while (FindNextFile(SearchHandle, &FindData));
}
//---------------------------------------------------------------------------
AnsiString TLoadThread::GetFileExtention(AnsiString FileName)
{
    int pos = FileName.LastDelimiter(".");
    return FileName.Delete(1, pos);
}
//---------------------------------------------------------------------------
DWORD TLoadThread::FileType(LPWIN32_FIND_DATA pFileData)
{
    bool IsDir;
    DWORD FType;
    FType = TYPE_FILE;
    IsDir = (pFileData->dwFileAttributes &
            FILE_ATTRIBUTE_DIRECTORY) != 0;

    if (IsDir)
    {
        if (AnsiString(pFileData->cFileName) == "." ||
            AnsiString(pFileData->cFileName) == "..")
            FType = TYPE_DOT;
        else
            FType = TYPE_DIR;
    }
    return FType;
}
//---------------------------------------------------------------------------
void __fastcall TLoadThread::UpdateList()
{
    ResultsImportForm->ResultFilesList->Items->Add();
    int count = ResultsImportForm->ResultFilesList->Items->Count;
    ResultsImportForm->ResultFilesList->Items->Item[count-1]->Caption = count;
    ResultsImportForm->ResultFilesList->Items->Item[count-1]->SubItems->Add("");
    ResultsImportForm->ResultFilesList->Items->Item[count-1]->SubItems->
                    Add(AnsiString(m_strCurrPath)+"\\"+m_strFileName);
    ResultsImportForm->ResultFilesList->Items->Item[count-1]->SubItems->Add(IntToStr(count) + "0");
}

Ошибка таже, происходит в UpdateList при обращении к ResultsImportForm->ResultFilesList.
_hunter , дублировать код для захламления топика я не буду, а если
Цитата

у меня желания нет.

Вас никто не заставляет smile
PM MAIL ICQ   Вверх
Romikgy
Дата 21.8.2006, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Цитата(Bunny @  21.8.2006,  11:49 Найти цитируемый пост)
"." - поиск в текущем каталоге.

* тоже ищет в текущем каталоге smile
не надо те потоки , чесн слово , у тя вся работа идет с формой
А глюка вот почему имхо 

Цитата(Bunny @  21.8.2006,  11:49 Найти цитируемый пост)
ResultsImportForm

эта переменная у тя в потоке неизвестна, передай при создании потока указатель на твою форму, и внутри потока юзай этот указатель а не саму форму


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
_hunter
Дата 21.8.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



"тут" (и "здесь") это, простите, где? на строке с комментарием (строки №1.3 и 3.62 в приведенном листинге)? -- что-то сильно в этом сомневаюсь...

Цитата(Bunny @  21.8.2006,  12:49 Найти цитируемый пост)
Ошибка таже, происходит в UpdateList при обращении к ResultsImportForm->ResultFilesList.

дык берем отладчик и смотрим NULL он (ResultFilesList) или не NULL (кстати эту проверку не помешалобы в код включить)

P.S.
(насчет захламления)
избыточным кодом ты топик захламляеш не меньше...

Добавлено @ 13:14 
Цитата(Romikgy @  21.8.2006,  13:05 Найти цитируемый пост)
эта переменная у тя в потоке неизвестна

была бы неизвестна -- код бы не скомпилился...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bunny
Дата 21.8.2006, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 22.3.2006

Репутация: 1
Всего: 1



Romikgy, нужен мне поток smile Файлы добавляются долго, и если не делать это в потоке, но форма "зависнет" и пользователь начнет нервничать.
 smile Ура! Заработало. Передал указатель на список ResultFilesList конструктору потока и через него обращался.
Romikgy, спасибо за идею  smile 
_hunter тоже спасибо  smile 

Это сообщение отредактировал(а) Bunny - 21.8.2006, 15:38
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.