Страница 1 из 1

Потоковая защищенность StiReport

Добавлено: 17 июн 2008, 03:44
ask
Пытаюсь использовать обьект StiReport в различных потоках, а именно при печати. Можно ли это делать, документации что то не нашел у вас на эту тему.

Потоковая защищенность StiReport

Добавлено: 19 июн 2008, 20:10
Vital
Здравствуйте,

Никаких проблем с формированием, экспортом или печатью отчетов в разных потоках быть не должно. Если будут какие то проблемы пишите, будем исправлять.

Спасибо.

Потоковая защищенность StiReport

Добавлено: 20 июн 2008, 07:02
NSG
Добрый день!
Разрешите немного Вам помочь. На самом деле, проблема, действительно, есть. Сваязана она со статической переменной 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

Добавлено: 20 июн 2008, 09:40
ask
Я использую 2007.3. Правку надо делать в статическом конструкторе StiReport?

Потоковая защищенность StiReport

Добавлено: 20 июн 2008, 10:48
NSG
Да, у нас тоже используется эта версия. Корректировку надо сделать в классе StiReport.
Есть тут небольшое допущение, что Вы все время будете использовать одни и те же потоки, иначе надо предусмотреть освобождение уже неиспльзованных ресурсов в measureGraphicsArray, например по завершению потоков.
Или подождите, какой вариант предложат авторы.

Потоковая защищенность StiReport

Добавлено: 20 июн 2008, 20:30
Ivan
Здравствуйте.

В версии 2008.2 в майских предрелизных билдах произведены некоторые изменения, касающиеся MeasureGraphics при многопоточной работе. На всех наших примерах проблем более не наблюдалось. Если Вы найдете еще какие-нибудь нюансы работы - пишите, будем исправлять.

Спасибо.

Потоковая защищенность StiReport

Добавлено: 23 июн 2008, 06:49
ask
А как по правильному передать объект 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.

Потоковая защищенность StiReport

Добавлено: 23 июн 2008, 14:30
Vital
Здравствуйте,

Если у Вас стоит задача просто напечатать отчет в другом потоке то проще сохранить его в строку (вернее результат его построения). Передать строку в другой поток. затем создать новый отчет и произвести печать. Смотрите методы SaveDocumentToString и LoadDocumentFromString у StiReport.

Спасибо.