Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 2
Регистрация: 12.12.2009
Сообщений: 30
1

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

28.04.2010, 15:33. Просмотров 765. Ответов 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), или что здесь сделал не правильно, знаю есть объекты синхронизации, но в данном примере адреса данных у каждого потока разные, как и сами данные?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2010, 15:33
Ответы с готовыми решениями:

Потоки, работа с памятью
Добрый день. Есть проект, в нем очень часты операции с памятью. Что бы не пересекались указатели...

Динамические массива. Ошибка с памятью?
integer ii,nn,tt,t,i,j,eps real,allocatable:: M(:,:),V0(:),V1(:) !real M(ii,ii),V0(nn),V1(nn) ...

сокращение обрабатываемой области на изображения
здравствуйте, есть секвенция изображений. первое изображение проходит через код: A =...

Разница между выделенной памятью и общей памятью графического процессора?
Здравствуйте! Купил и установил себе видеокарту GTX 1060 6Gb. При просмотре её производительности...

1
1 / 1 / 2
Регистрация: 12.12.2009
Сообщений: 30
30.04.2010, 10:38  [ТС] 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;
};
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2010, 10:38

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Что такое потоки ввода, потоки вывода?
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода,...

Как перемещать динамические Image и динамические Label одновременно?
Как перемещать динамические Image и динамические Label одновременно? То есть, в программе на ПКМ...

Байтовые потоки и потоки символов
Объясните, пожалуйста подробно что имелось ввиду На самом низком уровне все операции ввода/вывода...

Динамические (или не динамические.) переменные!
УважаемыЕ! Есть вопрос. Вот код программы (ТЗ метод северо-западного угла) - под спойлером. А вот...

Динамические массивы и функции. Динамические массивы.
Дана матрица 6х8 целого типа. Создать одномерный массив, содержащий элементы матрицы, кратные...

Работа с памятью
Друзья, ассемблер только начал изучать. Ассемблер начал изучать недавно и сейчас передо мной стоит...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.