Поиск:

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


Шустрый
*


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

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



Первый раз пытаюсь работать с потоками, поэтому трудно smile
Проблема такая:
создаю поток, функция потока вызывает функцию формы, которая рекурсивно ищет нужные файлы и добавляет их в ListView. Ищет она их нормально, но как только пытается обратиться к списку - вылетает выше написанная ошибка. Понимаю, что ошибка прав доступа, но как исправить  smile 
Если делать без потока - работает, но поиск в больших папках занимает много времени и во время поиска форма остается недоступной, и кажется что приложение повисло. Не хочется так оставлять, поэтому need help!
PM MAIL ICQ   Вверх
_hunter
Дата 16.8.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



код показывай


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата

как только пытается обратиться к списку - вылетает выше написанная ошибка

синхронизация
PM MAIL   Вверх
Bunny
Дата 16.8.2006, 20:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Выкладываю код (его нужную часть)
Код

#ifndef ResultsImportUnitH
#define ResultsImportUnitH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <Buttons.hpp>
#include <windows.h>
//---------------------------------------------------------------------------
class TResultsImportForm : public TForm
{
__published:    // IDE-managed Components
    TLabel *FileResultsLabel;
    TListView *ResultFilesList;
    TLabel *DirectoryLabel;
    TButton *OKImportBt;
    TButton *CancelImportBt;
    TLabel *ProgressLabel;
    TProgressBar *ProgressBar;
    TBitBtn *CheckAllBt;
    TBitBtn *UncheckedAllBt;
    void __fastcall ResultFilesListChange(TObject *Sender, TListItem *Item,
          TItemChange Change);
    void __fastcall OKImportBtClick(TObject *Sender);
    void __fastcall FormActivate(TObject *Sender);
    void __fastcall CheckAllBtClick(TObject *Sender);
    void __fastcall UncheckedAllBtClick(TObject *Sender);
    void __fastcall CancelImportBtClick(TObject *Sender);
private:    // User declarations
    DWORD FileType(LPWIN32_FIND_DATA pFileData);
    AnsiString GetFileExtention(AnsiString FileName);
public:        // User declarations
    AnsiString m_strPath;
    int CountChecked;
    __fastcall TResultsImportForm(TComponent* Owner);
    void LoadFilesInList(LPCTSTR PathName);
};
//---------------------------------------------------------------------------
extern PACKAGE TResultsImportForm *ResultsImportForm;
//---------------------------------------------------------------------------

#endif



Код

DWORD TResultsImportForm::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;
}
//---------------------------------------------------------------------------

AnsiString TResultsImportForm::GetFileExtention(AnsiString FileName)
{
    int pos = FileName.LastDelimiter(".");
    return FileName.Delete(1, pos);
}
//---------------------------------------------------------------------------

void TResultsImportForm::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")
            {
                /*ТУТ И ВЫЛАЗЕЕТ ОШИБКА!*/  
                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");
            }

        }
        else if (FType == TYPE_DIR)
        {
            SetCurrentDirectory(FindData.cFileName);
            LoadFilesInList("*");
            SetCurrentDirectory("..");
        }
    }
    while (FindNextFile(SearchHandle, &FindData));
}
//---------------------------------------------------------------------------
static unsigned __stdcall ThFunc(void * arg)
{
    ResultsImportForm->LoadFilesInList(".");
    return 0;
}
//---------------------------------------------------------------------------
void __fastcall TResultsImportForm::FormActivate(TObject *Sender)
{
    DirectoryLabel->Caption = m_strPath;
    SetCurrentDirectory(m_strPath.c_str());

    HANDLE Thread;
    unsigned threadId;
    Thread = (HANDLE)_beginthreadex(NULL, 0, ThFunc, (void*)0, 0, &threadId);

    if (Thread == INVALID_HANDLE_VALUE)
        MessageBox(NULL, "Не удалось создать поток поиска файлов.", "Ошибка",
            MB_ICONWARNING | MB_OK);
}




Это сообщение отредактировал(а) Bunny - 16.8.2006, 20:43
PM MAIL ICQ   Вверх
_hunter
Дата 17.8.2006, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



если ты только начинающий -- какой, нафик, _beginthreadex?!
используй TThread и его метод Synchronize


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


Шустрый
*


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

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



_hunter, TThread есть только в Билдере, а _beginthreadex можно использовать везде. Попробую TThread, если решит проблему - хорошо, но хотелось бы знать где здесь ошибка!

Попробовал TThread - вылетает таже самая ошибка, вопрос остается открытым.

Это сообщение отредактировал(а) Bunny - 17.8.2006, 15:25
PM MAIL ICQ   Вверх
_hunter
Дата 17.8.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Bunny @  17.8.2006,  15:06 Найти цитируемый пост)
TThread есть только в Билдере, а _beginthreadex можно использовать везде

ага. и TResultsImportForm (точнее TForm) тоже везде есть ;)

Цитата(Bunny @  17.8.2006,  15:06 Найти цитируемый пост)
Попробовал TThread - вылетает таже самая ошибка

еслибы ты всю фразу прочитал (про Synchronize я имею в виду)...


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


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


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

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



просто _hunter имеет ввиду, что
Цитата(Bunny @  17.8.2006,  14:06 Найти цитируемый пост)
TThread есть только в Билдере

здесь есть синхронизация 
Цитата(_hunter @  17.8.2006,  14:41 Найти цитируемый пост)
про Synchronize я имею в виду

Цитата(Bunny @  17.8.2006,  14:06 Найти цитируемый пост)
 _beginthreadex можно использовать везде

А здесь ее самому надо организовывать, ручками....
так что выбирай или то что у борланда , где все за тебя сделали,
или то что везде работает , но надо самому поработать!
Это почитай хоть и на дельфи но это имхо основы
http://forum.vingrad.ru/index.php?showtopic=60076


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

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


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

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



Все вокруг жа около, вот нет что бы сказать человеку:

Все ф-ии которые используют VCL - необходимо помещать в Synchronize;


#include <vcl.h>

 void __fastcall Execute()
{
  Synchronize( MMY_ESSAGE );
}

void MMY_ESSAGE()
{
  ShowMessage("TEST");
}


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
_hunter
Дата 17.8.2006, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



по-моему в справке тоже самое написанно...


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


Шустрый
*


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

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



Artemon, именно так и было написано:
Код

void __fastcall TMyThread::Execute()
{
while(!Terminated) Synchronize(MyFunction);
}

Да и как я понимаю синхронизация нужна когда есть несколько потоков, чтобы не допустить одновременного использования общих ресурсов?! А у меня один поток! Может из-за рекурсии?
PM MAIL ICQ   Вверх
Artemon
Дата 17.8.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

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



Да нипричем тут твоя рекурсия.
синхронизировать нужно всегда с vcl.

Покажи новый вариант кода с TThread


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
BreakPointMAN
Дата 18.8.2006, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Bunny @  17.8.2006,  21:12 Найти цитируемый пост)
А у меня один поток!

Правда? Считаем... в одном потоке работает VCL, другой поток создаешь ты для необходимых тебе манипуляций... итого потоков: ?


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Bunny
Дата 19.8.2006, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

__fastcall TLoadThread::TLoadThread(bool CreateSuspended)
    : TThread(CreateSuspended)
{
    FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall TLoadThread::Execute()
{
    Synchronize(LoadFunction);
}
//---------------------------------------------------------------------------
void __fastcall TLoadThread::LoadFunction()
{
    ResultsImportForm->LoadFilesInList(".");
}

Код

void __fastcall TResultsImportForm::FormActivate(TObject *Sender)
{
    DirectoryLabel->Caption = m_strPath;
    SetCurrentDirectory(m_strPath.c_str());

    TLoadThread * LoadThread = new TLoadThread();
/*подскажите как удалить этот указатель?!*/
}

весь остальной код остался прежним.
Ошибка таже: "Access violation at addres ..."
PM MAIL ICQ   Вверх
Romikgy
Дата 19.8.2006, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Bunny @  19.8.2006,  16:32 Найти цитируемый пост)
/*подскажите как удалить этот указатель?!*/

а чем он те не нравится?
Цитата(Bunny @  19.8.2006,  16:32 Найти цитируемый пост)
ResultsImportForm->LoadFilesInList(".");

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


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

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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