beginthread
От: _synapse_  
Дата: 04.10.05 10:47
Оценка:
Есть класс чтения и обработки определенных файлов.
Хочу сделать функцию чтения в отдельном потоке, но получается цепная реакция, чтобы запустить с ней отдельный поток нужно сделать ее статической, при этом по цепочке компилятор запрещает делать из неё вызовы не статических функций, чтож мне теперь весь класс сделать статическим,????
Re: beginthread
От: deniszb  
Дата: 04.10.05 10:51
Оценка:
Здравствуйте, _synapse_, Вы писали:

__>Есть класс чтения и обработки определенных файлов.

__>Хочу сделать функцию чтения в отдельном потоке, но получается цепная реакция, чтобы запустить с ней отдельный поток нужно сделать ее статической, при этом по цепочке компилятор запрещает делать из неё вызовы не статических функций, чтож мне теперь весь класс сделать статическим,????

Передай статической ф-ции указатель на нужный объект класса, и потом через него и работай
Re: beginthread
От: crable США  
Дата: 04.10.05 10:55
Оценка:
Здравствуйте, _synapse_, Вы писали:

__>Есть класс чтения и обработки определенных файлов.

__>Хочу сделать функцию чтения в отдельном потоке, но получается цепная реакция, чтобы запустить с ней отдельный поток нужно сделать ее статической, при этом по цепочке компилятор запрещает делать из неё вызовы не статических функций, чтож мне теперь весь класс сделать статическим,????
передавай в статическую функцию указатель на объект класса, что-то вроде:


class A
{
public:
static void f1(void *arg)
{
  A *a = static_cast<A *>(arg);
  a->f2();
}
void f2();
};

//...
A *a = ...
create_thread(..., A::f1, a, ...);
//...
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: beginthread
От: _synapse_  
Дата: 04.10.05 11:18
Оценка:
Я думал об этом но почему то посчитал этот способ не очень красивым и решил спросить что то по эстетичнее...
Может если возникает такая проблема это ошибка проектирования??? или такое бывает?
Re: beginthread
От: Аноним  
Дата: 04.10.05 11:25
Оценка:
http://www.rsdn.ru/Forum/Info.aspx?name=FAQ.cpp.threadandmember
Автор: MaximE
Дата: 08.08.04
Re[2]: beginthread
От: srggal Украина  
Дата: 04.10.05 11:30
Оценка:
Здравствуйте, _synapse_, Вы писали:

__>Я думал об этом но почему то посчитал этот способ не очень красивым и решил спросить что то по эстетичнее...

__>Может если возникает такая проблема это ошибка проектирования??? или такое бывает?

Если грить о проектировании, то на всякий случай стоит изучить паттерн ActiveObject
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: beginthread
От: Balsamo Россия  
Дата: 04.10.05 20:30
Оценка:
Здравствуйте, _synapse_, Вы писали:

__>Есть класс чтения и обработки определенных файлов.

__>Хочу сделать функцию чтения в отдельном потоке, но получается цепная реакция, чтобы запустить с ней отдельный поток нужно сделать ее статической, при этом по цепочке компилятор запрещает делать из неё вызовы не статических функций, чтож мне теперь весь класс сделать статическим,????

Помимо того, что тебе написали, есть еще вариант.
В своем классе классе объявляешь функцию чтения закрытой с немного измеименем. Определяешь полностью ее тело.
Объявляешь открытую член-функцию, котороя по смыслу бы выполняла бы указанное действие, но в ее теле определяешь код, который создает отдельный потокна основе дружественной функции. В дружественную функцию передаешь указатель на класс через CreateThread(,,,указатель_на_класс,,) и вызываешь внутри ее закрытый метод чтения. Таким образом, метод чтения будет выполняться в потоке.
Re[2]: beginthread
От: Кодт Россия  
Дата: 04.10.05 22:04
Оценка:
Здравствуйте, _synapse_, Вы писали:

__>Я думал об этом но почему то посчитал этот способ не очень красивым и решил спросить что то по эстетичнее...

__>Может если возникает такая проблема это ошибка проектирования??? или такое бывает?

Это не ошибка проектирования, а результат того, что beginthread — очень низкоуровневая функция. Она ничего не знает про объекты.

Если не хочешь возиться с такими вещами (и, в общем-то, правильно: в лучшем случае изобретёшь велосипед, а в худшем сделаешь ошибки, в т.ч. в проектировании) — обратись к объектно-ориентированным библиотекам работы с потоками.
Например, ACE или boost/thread.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.