Потоковая защищенность StiReport
Потоковая защищенность StiReport
Пытаюсь использовать обьект StiReport в различных потоках, а именно при печати. Можно ли это делать, документации что то не нашел у вас на эту тему.
Потоковая защищенность StiReport
Здравствуйте,
Никаких проблем с формированием, экспортом или печатью отчетов в разных потоках быть не должно. Если будут какие то проблемы пишите, будем исправлять.
Спасибо.
Никаких проблем с формированием, экспортом или печатью отчетов в разных потоках быть не должно. Если будут какие то проблемы пишите, будем исправлять.
Спасибо.
Потоковая защищенность StiReport
Добрый день!
Разрешите немного Вам помочь. На самом деле, проблема, действительно, есть. Сваязана она со статической переменной StiReport.measureGraphics.
При одновременном обращении к ней из разных потоков все падает. Можно решить довольно просто, заменив ее на свойство, чтобы возращать свой Graphics для каждого потока. В связи с этим, из конструктора StiReport убираем инициализацию StiReport.measureGraphics.
Вместо StiReport.measureGraphics вставляем следующий код:
Разрешите немного Вам помочь. На самом деле, проблема, действительно, есть. Сваязана она со статической переменной StiReport.measureGraphics.
При одновременном обращении к ней из разных потоков все падает. Можно решить довольно просто, заменив ее на свойство, чтобы возращать свой Graphics для каждого потока. В связи с этим, из конструктора StiReport убираем инициализацию StiReport.measureGraphics.
Вместо StiReport.measureGraphics вставляем следующий код:
Код: Выделить всё
//NsgSoft
//Graphics нужно создавать по потокам, иначе получаем Exception
internal static Dictionary measureGraphicsArray = new Dictionary();
private static Graphics measureGraphics
{
get
{
int threadID = System.Threading.Thread.CurrentThread.ManagedThreadId;
if (measureGraphicsArray.ContainsKey(threadID))
{
return measureGraphicsArray[threadID];
}
else
{
Graphics mG = null;
if (StiOptions.Engine.OldWYSIWYG)
{
Graphics mG = Graphics.FromImage(new Bitmap(1, 1));
mG.PageUnit = GraphicsUnit.Inch;
mG.PageScale = .01f;
}
else
{
mG = Graphics.FromImage(new Bitmap(1, 1));
mG.PageUnit = GraphicsUnit.Pixel;
mG.PageScale = 1f;
}
measureGraphicsArray[threadID] = mG;
return mG;
}
}
}
Потоковая защищенность StiReport
Я использую 2007.3. Правку надо делать в статическом конструкторе StiReport?
Потоковая защищенность StiReport
Да, у нас тоже используется эта версия. Корректировку надо сделать в классе StiReport.
Есть тут небольшое допущение, что Вы все время будете использовать одни и те же потоки, иначе надо предусмотреть освобождение уже неиспльзованных ресурсов в measureGraphicsArray, например по завершению потоков.
Или подождите, какой вариант предложат авторы.
Есть тут небольшое допущение, что Вы все время будете использовать одни и те же потоки, иначе надо предусмотреть освобождение уже неиспльзованных ресурсов в measureGraphicsArray, например по завершению потоков.
Или подождите, какой вариант предложат авторы.
Потоковая защищенность StiReport
Здравствуйте.
В версии 2008.2 в майских предрелизных билдах произведены некоторые изменения, касающиеся MeasureGraphics при многопоточной работе. На всех наших примерах проблем более не наблюдалось. Если Вы найдете еще какие-нибудь нюансы работы - пишите, будем исправлять.
Спасибо.
В версии 2008.2 в майских предрелизных билдах произведены некоторые изменения, касающиеся MeasureGraphics при многопоточной работе. На всех наших примерах проблем более не наблюдалось. Если Вы найдете еще какие-нибудь нюансы работы - пишите, будем исправлять.
Спасибо.
Потоковая защищенность StiReport
А как по правильному передать объект StiReport в другой поток. Я пробую через Clone() но при вызове метода Print, почему то начинается компиляция отчета и она почему отваливается с ошибкой
2008:06:23, 11:33: StiReport: c:\Documents and Settings\Zinurov.PATRIOT\Local Settings\Temp\fgbuamy0.0.cs(14,34) : error CS0234: The type or namespace name 'Двусторонний_образ' does not exist in the namespace 'Reports' (are you missing an assembly reference?)
2008:06:23, 11:33: StiReport: Compiling report...ERROR
2008:06:23, 11:33: StiReport: Method : [Compile] : c:\Documents and Settings\Zinurov.PATRIOT\Local Settings\Temp\fgbuamy0.0.cs(14,34) : error CS0234: The type or namespace name 'Двусторонний_образ' does not exist in the namespace 'Reports' (are you missing an assembly reference?)
Двусторонний образ - это имя отчета. Класс отчета загружается из dll, к нему подгружаются данные, вызывается Render, потом Clone и у клонированного обьекта вызывается метод Print.
2008:06:23, 11:33: StiReport: c:\Documents and Settings\Zinurov.PATRIOT\Local Settings\Temp\fgbuamy0.0.cs(14,34) : error CS0234: The type or namespace name 'Двусторонний_образ' does not exist in the namespace 'Reports' (are you missing an assembly reference?)
2008:06:23, 11:33: StiReport: Compiling report...ERROR
2008:06:23, 11:33: StiReport: Method : [Compile] : c:\Documents and Settings\Zinurov.PATRIOT\Local Settings\Temp\fgbuamy0.0.cs(14,34) : error CS0234: The type or namespace name 'Двусторонний_образ' does not exist in the namespace 'Reports' (are you missing an assembly reference?)
Двусторонний образ - это имя отчета. Класс отчета загружается из dll, к нему подгружаются данные, вызывается Render, потом Clone и у клонированного обьекта вызывается метод Print.
Потоковая защищенность StiReport
Здравствуйте,
Если у Вас стоит задача просто напечатать отчет в другом потоке то проще сохранить его в строку (вернее результат его построения). Передать строку в другой поток. затем создать новый отчет и произвести печать. Смотрите методы SaveDocumentToString и LoadDocumentFromString у StiReport.
Спасибо.
Если у Вас стоит задача просто напечатать отчет в другом потоке то проще сохранить его в строку (вернее результат его построения). Передать строку в другой поток. затем создать новый отчет и произвести печать. Смотрите методы SaveDocumentToString и LoadDocumentFromString у StiReport.
Спасибо.