Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
DiMasKiss
1 / 1 / 0
Регистрация: 12.12.2009
Сообщений: 30
#1

Динамические потоки c обрабатываемой памятью - C++

28.04.2010, 15:33. Просмотров 444. Ответов 1
Метки нет (Все метки)

Нужна ваша помощь.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "WinThread.h"
 
LPVOID hf1,hf2,hf3;
iXml* Tr;
AnsiString str;
std::vector<GraphObj *> *GNO;
 
typedef struct Params
{
        int i,numnode;
        iXml *N;
        std::vector<GraphObj *> *GO;
 
}PARAMSTRUST;
 
iXml* VectorNode(iXml *N,vector<GraphObj *> *GO,int potoc,int num)
{
iXml *T;
GraphObj *Node = new GraphObj;
GNO->push_back(Node);
Node->LType->Caption = N->TypePrint();
N->GenRandomNum();
Node->LRandom->Caption = N->RandomPrint();
Node->Print(potoc,num);
      T = N->GetNode(0);
 return T;
};
 
void CALLBACK f2(void* param)
{
        while(1){
        SwitchToFiber(hf1);
        }
}
 
DWORD CALLBACK  third(LPVOID param)                     // этот поток обрабатывает структуру из объктов ввиде вектора
{
        PARAMSTRUST *P=(PARAMSTRUST *)param;
        hf1=ConvertThreadToFiber(NULL);
        hf2=CreateFiber(NULL,f2,hf1);
        while (P->N->TypePrint()!="Join")
        {
                if (P->N->TypePrint()=="Join")break;
                str = P->N->TypePrint();
                P->numnode++;
                P->N=VectorNode(P->N,P->GO,P->i,P->numnode);
                SwitchToFiber (hf2);
        }
        while(1)
        {
            SwitchToFiber (hf2);
        }
}
 
WinThread::WinThread(int i,iXml *N,vector<GraphObj *> *GNode)
{
        PARAMSTRUST *P=new PARAMSTRUST;
        P->i = i;
        P->N = N;
        P->GO = GNode;
        P->numnode = 0;
        threads=CreateThread(NULL,NULL,third,(LPVOID)P,NULL,NULL);
}
есть некая структура из объектов, ветки которой обрабатывает отдельный поток, веток может быть не счетное количество, а значит потоки должны быть динамическими.
На данном примере создается 3 потока
C++
1
2
3
4
5
6
7
8
9
if(Tr->TypePrint()=="Fork"){
        while (i<Tr->CountIndex())
//        i=0;
        {
             WinThread *ProThread = new WinThread(i,Tr->GetNode(i),&NG);
             T.push_back(ProThread);
             i++;
        }
 }
Результат с двумя потоками таков:
Если выполнять потоки каждый в отдельности (по одному), то на выходе обработки результат положительный. Если выполняются два потока, то первый обрабатывает не до конца, второй проходит вектор положительно, и если выполняются три потока, то выводится ошибка об обращении к защищенной памяти другого процесса.
Как быть в этой ситуации, можно ли создать динамические потоки по этому принципу (через winapy) или есть другие варианты динамических потоков (TThread), или что здесь сделал не правильно, знаю есть объекты синхронизации, но в данном примере адреса данных у каждого потока разные, как и сами данные?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2010, 15:33     Динамические потоки c обрабатываемой памятью
Посмотрите здесь:

Проблемы с памятью Visual C++
проблемы с памятью.... C++
C++ Linux Работа с памятью
работа с памятью C++
Работа с памятью C++
C++ работа с памятью
C++ Работа с памятью в С++
Работа с памятью C++
Управление памятью C++
C++ Проблемы с памятью
C++ WinAPI Управление памятью
Динамические (или не динамические.) переменные! C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiMasKiss
1 / 1 / 0
Регистрация: 12.12.2009
Сообщений: 30
30.04.2010, 10:38  [ТС]     Динамические потоки c обрабатываемой памятью #2
Решил проблему через TThread
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//---------------------------------------------------------------------------
class TProThread : public TThread
{
private:
        bool bl;
        int NT,numnode;
        vector<GraphObj *> GO;
        iXml *N;
protected:
        void __fastcall Execute();
public:
        __fastcall TProThread(int Thread,iXml *N);
        void __fastcall ThreadProgress();
        iXml* TProThread::VectorNode(iXml *N,vector<GraphObj *> &GO,int potoc,int num);
};
//---------------------------------------------------------------------------
#endif
 
 
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "ThreadUnit.h"
#include "xmltree.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
 
//   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 TProThread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
__fastcall TProThread::TProThread(int Thread,iXml *Node) : TThread(false)
{ NT = Thread;
  FreeOnTerminate = true;
  N = Node;
  bl = false;
}
//---------------------------------------------------------------------------
void __fastcall TProThread::Execute()
{while (!Terminated){
        Synchronize(ThreadProgress);
        if (bl == true) break;
}
}
//---------------------------------------------------------------------------
void __fastcall TProThread::ThreadProgress()
{
numnode++;
if (N->TypePrint()!="Join") N=VectorNode(N,GO,NT,numnode);
if (N->TypePrint()=="Join"){
bl = true;
}
}
//---------------------------------------------------------------------------
iXml* TProThread::VectorNode(iXml *N,vector<GraphObj *> &GO,int potoc,int num)
{
iXml *T;
GraphObj *Node = new GraphObj;
GO.push_back(Node);
Node->LType->Caption = N->TypePrint();
N->GenRandomNum();
Node->LRandom->Caption = N->RandomPrint();
Node->Print(potoc,num);
      T = N->GetNode(0);
return T;
};
Yandex
Объявления
30.04.2010, 10:38     Динамические потоки c обрабатываемой памятью
Ответ Создать тему
Опции темы

Текущее время: 12:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru