webbrowser проблемы с многопоточностью
От: Аноним  
Дата: 03.06.13 03:41
Оценка:
Добрый день.

1 ) у меня написан некоторый ActiveX компонент
2 ) в нем вызываются эвенты на которые подписан javascript код
3 ) эвенты могут вызывать как с основного потока ActiveX ,так и с подчиненых потоков того же обьекта ActiveX

в IExplorer работает всё отлично,а написав простое приложение с контролом webbrowser у меня возникли проблемы что оно периодически крашится,
как мне кажется это происходит при работе с потоками,когда эвент генерирует не основной ,а подчиненые потоки.


как решить данную проблемму ?
Re: webbrowser проблемы с многопоточностью
От: Аноним  
Дата: 03.06.13 05:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.


А>1 ) у меня написан некоторый ActiveX компонент

А>2 ) в нем вызываются эвенты на которые подписан javascript код
А>3 ) эвенты могут вызывать как с основного потока ActiveX ,так и с подчиненых потоков того же обьекта ActiveX

А>в IExplorer работает всё отлично,а написав простое приложение с контролом webbrowser у меня возникли проблемы что оно периодически крашится,

А>как мне кажется это происходит при работе с потоками,когда эвент генерирует не основной ,а подчиненые потоки.


А>как решить данную проблемму ?

крашится с ошибкой accessviolationexception и пишет только в системный журнал,а от приложения не слова ,молча закрывается
Re: webbrowser проблемы с многопоточностью
От: visus  
Дата: 03.06.13 10:55
Оценка:
А>как решить данную проблемму ?

WebBrowser это однопоточный компонент. Исключить обащение к компоненту не из STAThread из других потоков.
Re: webbrowser проблемы с многопоточностью
От: TK Лес кывт.рф
Дата: 03.06.13 20:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>в IExplorer работает всё отлично,а написав простое приложение с контролом webbrowser у меня возникли проблемы что оно периодически крашится,

А>как мне кажется это происходит при работе с потоками,когда эвент генерирует не основной ,а подчиненые потоки.

В COM евенты это фактически интерфейсы которые должны корректно маршаллится через границы апартментов. Если ActiveX этого не делает, то рано или поздно начтет крешится и IE
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: webbrowser проблемы с многопоточностью
От: Аноним  
Дата: 04.06.13 05:25
Оценка:
Здравствуйте, TK, Вы писали:

TK>Здравствуйте, Аноним, Вы писали:


А>>в IExplorer работает всё отлично,а написав простое приложение с контролом webbrowser у меня возникли проблемы что оно периодически крашится,

А>>как мне кажется это происходит при работе с потоками,когда эвент генерирует не основной ,а подчиненые потоки.

TK>В COM евенты это фактически интерфейсы которые должны корректно маршаллится через границы апартментов. Если ActiveX этого не делает, то рано или поздно начтет крешится и IE


судя по всему это проблема не в многопоточности ActiveX.

ошибка в логе системного журнала следующяя :


Application: WebBrowser.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException
Stack:
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG ByRef)
   at System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr, Int32, Int32)
   at System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext)
   at System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext)
   at System.Windows.Forms.Application.Run(System.Windows.Forms.Form)
   at WebBrowser.Program.Main()


не совсем понятно куда копать...т.к вылетает(на одних и тех же действиях может вылететь ,а может нет) она крайне редко,но крашит приложение
Re[3]: webbrowser проблемы с многопоточностью
От: TK Лес кывт.рф
Дата: 04.06.13 08:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>Application: WebBrowser.exe
А>Framework Version: v4.0.30319
А>Description: The process was terminated due to an unhandled exception.
А>Exception Info: System.AccessViolationException
А>Stack:
А>   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG ByRef)
А>   at System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr, Int32, Int32)
А>   at System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext)
А>   at System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext)
А>   at System.Windows.Forms.Application.Run(System.Windows.Forms.Form)
А>   at WebBrowser.Program.Main()
А>


А>не совсем понятно куда копать...т.к вылетает(на одних и тех же действиях может вылететь ,а может нет) она крайне редко,но крашит приложение


Цепляетесь unmanaged отладчиком и смотрите в какой именно точке возникает этот access violation (какой callstack, какое именно сообщение обрабатывалось и т.п.), обработайте это исключение...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: webbrowser проблемы с многопоточностью
От: Аноним  
Дата: 05.06.13 05:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.


А>1 ) у меня написан некоторый ActiveX компонент

А>2 ) в нем вызываются эвенты на которые подписан javascript код
А>3 ) эвенты могут вызывать как с основного потока ActiveX ,так и с подчиненых потоков того же обьекта ActiveX

А>в IExplorer работает всё отлично,а написав простое приложение с контролом webbrowser у меня возникли проблемы что оно периодически крашится,

А>как мне кажется это происходит при работе с потоками,когда эвент генерирует не основной ,а подчиненые потоки.


А>как решить данную проблемму ?


По факту обнаружил что при возникновении события на стороне ActiveX возникает ошибка,даже если это произошло в основном потоке ActiveX.

    [ComVisible(true)]
    [Guid("E4EBA458-CEE2-4BA8-AF1D-752750C17833")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IActiveXEvents
    {
        [DispId(7)]
        void OnSReader(string code, string add);
        [DispId(8)]
        void Recv(string a, string msg);
        [DispId(9)]
        void ISet(string block, string code,int param);
    }


далее код: делал вызов


public class CMain :  IActiveX, IDisposable
{
//....
public void ISetProvider(string add, string code, int st)
        {
            if (ISet != null)
               ISet(add, code, st);
            
        }
//....
}


в index.html

document.myAx.attachEvent("ISet",MyISet);
function MyISet(code,add,param)
{
//..
  $('#'+code).html(add);
}


просто создал приложение с Webbrowser которое загружает index.html ,он в свою очередь подключает ActiveX и подписывается на события.
В ActiveX в цикле 100 раз для примера сгенерировал событие.

for(int i =0;i<100;i++)
ISet("t", "test",11);


и приложение с контролом Webbrowser падает.
//--------------------------------------------------
а самое интересное что на компьютере с Win 7 данной проблемы не замечено работает как в обычном Iexplore.exe так и в моем приложении с контролом Webbrowser.

а на win xp работает только в Iexplore.exe , а на моем приложении всё падает,в чем дело не совсем понятно...отладка показывает что мое приложение падает в библиотеке jscript.dll на функции InvokeEx.
//---------------
проблема так и не решена...просто использую
Interop.SHDocVw COM объект ieframe.

в общем всё печально,не понятно такое поведение ( всё классно на win 7 ,но на winxp только ед. выход это Interop.SHDocVw COM)
Re[2]: webbrowser проблемы с многопоточностью
От: TK Лес кывт.рф
Дата: 05.06.13 06:07
Оценка:
Здравствуйте, Аноним, Вы писали:


А>просто создал приложение с Webbrowser которое загружает index.html ,он в свою очередь подключает ActiveX и подписывается на события.

А>В ActiveX в цикле 100 раз для примера сгенерировал событие.

А>
А>for(int i =0;i<100;i++)
А>ISet("t", "test",11);
А>


Со строками у вас все в порядке, в BSTR их кто конвертирует?
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: webbrowser проблемы с многопоточностью
От: Аноним  
Дата: 05.06.13 11:48
Оценка:
Здравствуйте, TK, Вы писали:

TK>Здравствуйте, Аноним, Вы писали:



А>>просто создал приложение с Webbrowser которое загружает index.html ,он в свою очередь подключает ActiveX и подписывается на события.

А>>В ActiveX в цикле 100 раз для примера сгенерировал событие.

А>>
А>>for(int i =0;i<100;i++)
А>>ISet("t", "test",11);
А>>


TK>Со строками у вас все в порядке, в BSTR их кто конвертирует?


Об этом я не задумывался может действительно из-за этого...хотя всё равно не совсем ясно почему этот код отрабатывает отлично на win 7.
Спасибо за совет,я попробую конвертить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.