Есть класс чтения и обработки определенных файлов.
Хочу сделать функцию чтения в отдельном потоке, но получается цепная реакция, чтобы запустить с ней отдельный поток нужно сделать ее статической, при этом по цепочке компилятор запрещает делать из неё вызовы не статических функций, чтож мне теперь весь класс сделать статическим,????
Здравствуйте, _synapse_, Вы писали:
__>Есть класс чтения и обработки определенных файлов. __>Хочу сделать функцию чтения в отдельном потоке, но получается цепная реакция, чтобы запустить с ней отдельный поток нужно сделать ее статической, при этом по цепочке компилятор запрещает делать из неё вызовы не статических функций, чтож мне теперь весь класс сделать статическим,????
Передай статической ф-ции указатель на нужный объект класса, и потом через него и работай
Здравствуйте, _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.
Я думал об этом но почему то посчитал этот способ не очень красивым и решил спросить что то по эстетичнее...
Может если возникает такая проблема это ошибка проектирования??? или такое бывает?
Здравствуйте, _synapse_, Вы писали:
__>Я думал об этом но почему то посчитал этот способ не очень красивым и решил спросить что то по эстетичнее... __>Может если возникает такая проблема это ошибка проектирования??? или такое бывает?
Если грить о проектировании, то на всякий случай стоит изучить паттерн ActiveObject
Здравствуйте, _synapse_, Вы писали:
__>Есть класс чтения и обработки определенных файлов. __>Хочу сделать функцию чтения в отдельном потоке, но получается цепная реакция, чтобы запустить с ней отдельный поток нужно сделать ее статической, при этом по цепочке компилятор запрещает делать из неё вызовы не статических функций, чтож мне теперь весь класс сделать статическим,????
Помимо того, что тебе написали, есть еще вариант.
В своем классе классе объявляешь функцию чтения закрытой с немного измеименем. Определяешь полностью ее тело.
Объявляешь открытую член-функцию, котороя по смыслу бы выполняла бы указанное действие, но в ее теле определяешь код, который создает отдельный потокна основе дружественной функции. В дружественную функцию передаешь указатель на класс через CreateThread(,,,указатель_на_класс,,) и вызываешь внутри ее закрытый метод чтения. Таким образом, метод чтения будет выполняться в потоке.
Здравствуйте, _synapse_, Вы писали:
__>Я думал об этом но почему то посчитал этот способ не очень красивым и решил спросить что то по эстетичнее... __>Может если возникает такая проблема это ошибка проектирования??? или такое бывает?
Это не ошибка проектирования, а результат того, что beginthread — очень низкоуровневая функция. Она ничего не знает про объекты.
Если не хочешь возиться с такими вещами (и, в общем-то, правильно: в лучшем случае изобретёшь велосипед, а в худшем сделаешь ошибки, в т.ч. в проектировании) — обратись к объектно-ориентированным библиотекам работы с потоками.
Например, ACE или boost/thread.