C# Invoke ๋ฉˆ์ถค ํ˜„์ƒ

์•ˆ๋…•ํ•˜์„ธ์š”. ํ˜„์žฌ ์ €๋Š” C# .net์„ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ์ž‘ ์ค‘์ž…๋‹ˆ๋‹ค.
๋‹ค๋ฆ„์ด ์•„๋‹ˆ๋ผ Invoke๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๋ฉˆ์ถค ํ˜„์ƒ์ด ์ผ์–ด๋‚˜ ์–ด๋–ค ์›์ธ์ธ ์ง€ ๊ถ๊ธˆํ•ด์„œ ๊ธ€์„ ์”๋‹ˆ๋‹ค.
๋จผ์ € ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์„ค๋ช… ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
์นด๋ฉ”๋ผ๋ฅผ ์ธ์‹ํ•˜๋Š” Thread์—์„œ ์นด๋ฉ”๋ผ ๋ผ์ด๋ธŒ ๊ฐ์ฒด๋ฅผ ์ œ์ž‘ ํ›„ UI Control์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ UI Control์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ด UI Thread๊ฐ€ ์•„๋‹Œ ์นด๋ฉ”๋ผ ์ธ์‹ํ•˜๋Š” Thread์—์„œ ์ถ”๊ฐ€ํ•˜๊ธฐ ํ˜ธ์ถœ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ Invoke ์ค„์ด ์‹คํ–‰ ๋œ ํ›„ AddCameraView ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋˜์ง€ ์•Š๋„ค์š”.
ํ˜น์‹œ ํ˜ธ์ถœ ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์•„์‹œ๋Š” ๋ถ„ ๊ผญ ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

public void OnCameraAddEvent(object sender, CameraAddArgs e)
{
    Console.WriteLine("ํ˜„์žฌ Thread : {0}", Thread.CurrentThread.ManagedThreadId);

    if (this.camScrollView.InvokeRequired)
        this.camScrollView.Invoke(new Action(delegate () { AddCameraView(e.cameraView, e.cameraName); }));
    else 
        AddCameraView(e.cameraView, e.cameraName);
}
1 Like

์žฌํ˜„๋˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ™์ด ์ฒจ๋ถ€ํ•ด ์ฃผ์‹œ๊ฒ ์–ด์š”?

1 Like

ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ๋ผ ์ฝ”๋“œ ์ž์ฒด๋ฅผ ์ฒจ๋ถ€ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‚ด์šฉ์œผ๋กœ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

private void AddCameraView(CaptureCameraView view)
{
    Console.WriteLine("D");
    this.cameraViews.Add(view);
    this.camScrollView.Controls.Add(view);
    CameraController.Instance.setTriggerMode(view.Index, false);
    CameraController.Instance.Grab(view.Index);
}

์ดํ•ด๊ฐ€ ์•ˆ๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์œผ์‹œ๋ฉด ๋ฐ”๋กœ๋ฐ”๋กœ ๋‹ต ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.!

1 Like

UI Thread๋ฅผ ๊ฝ‰์žก๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ์–ด์„œ Invoke๋ฅผ ํ–ˆ์„ ๋•Œ ๋จนํ†ต์ด ๋˜๋Š”๊ฒŒ ์•„๋‹Œ๊ฐ€ ์‹ถ๋„ค์š”.

1 Like

ํ˜น์‹œ ๊ฝ‰ ์žก๋Š”๋‹ค๋Š” ์˜ˆ์‹œ ์•Œ ์ˆ˜ ์žˆ์„ ๊นŒ์š”โ€ฆ? ์•„์ง ๋ฌด์Šจ ์˜๋ฏธ์ธ ์ง€ ๋ชจ๋ฅด๊ฒ ๋„ค์š”.

1 Like

์žฌํ˜„ ํ”„๋กœ์ ํŠธ๋ผ ํ•˜์‹ฌ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ๋”ฑ ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์˜ฌ๋ ค๋‹ฌ๋ผ๊ณ  ํ•˜์‹  ์˜๋ฏธ์ด์‹ค๊ฒ๋‹ˆ๋‹ค.

์œ ๋‹›ํ…Œ์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค๋ฉด ๋”ฑ ๋ชจ๋“ˆ๊ณผ ์œ ๋‹›ํ…Œ์ŠคํŠธ๋งŒ ๋–ผ์„œ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ๋งŽ์€ ํšŒ์‚ฌ๋“ค์ด ๊ทธ๋ ‡์ง€ ๋ชปํ• ๊ฑฐ๊ตฌ์š”.

๊ทธ๋ž˜์„œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋‹ค๋ฅธ ๊ฑฐ ๋‹ค ์ œ์™ธํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ •๋„์˜ ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ๋ฅผ ์Šค์Šค๋กœ ๋งŒ๋“ค์–ด ๋ณด๋Š” ๊ฒ๋‹ˆ๋‹ค.

์žฌํ˜„ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋‹ค๋ฅธ ๊ฒƒ์ด ์›์ธ์ด๋‹ค ๋ผ๋Š” ๊ฒƒ์„ ์Šค์Šค๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ณ , ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ž˜๋ชป ๋งŒ๋“  ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ ๊ทธ๊ฒƒ์€ ์ฝ”๋“œ๋กœ ๋ณด์—ฌ์ ธ์•ผ ์•Œ ์ˆ˜ ์žˆ์ฃ .

์งˆ๋ฌธ์ž ๋‹˜๊ป˜์„œ ์ •์„ฑ๋“ค์—ฌ์„œ ์ƒ˜ํ”Œํ”„๋กœ์ ํŠธ์™€ ์งˆ๋ฌธ์„ ๋””ํ…Œ์ผํ•˜๊ฒŒ ํ•˜์‹ค ์ˆ˜๋ก ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋‹ต๋ณ€์ž๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— DevExpress ๊ฐ™์€ํšŒ์‚ฌ์—์„œ๋„ ์ฝ”๋“œ์— ๊ด€ํ•œ ์งˆ๋ฌธ์„ ์˜ฌ๋ฆด ๋•Œ๋Š” ์ƒ˜ํ”Œํ”„๋กœ์ ํŠธ๋ฅผ ์ฒจ๋ถ€ํ•˜๋ผ๊ณ  ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฒ˜์Œ์ด๋ผ ๋„ˆ๋ฌด ์–ด๋ ต๊ณ , ๊ท€์ฐฎ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณธ์ธ์˜ ์‹œ๊ฐ„์„ ์ตœ๋Œ€๋กœ ํˆฌ์žํ•ด์„œ ๋‹ต๋ณ€ํ•ด์ฃผ์‹œ๋Š” ๋ถ„์˜ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™” ํ•˜๊ณ  ํ•‘ํํƒ€์ž„์œผ๋กœ ์˜ค๋Š” ๋ ˆ์ดํ„ด์‹œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ์ˆ˜๋‹จ์€ ์ƒ˜ํ”Œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์Šต๊ด€์€ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ตฌ์ฒดํ™” ํ•˜๋Š” ํ›ˆ๋ จ๋„ ๋˜๋Š”๊ฑฐ๋ผ์„œ ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด๋ณด์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

3 Likes

์•„๋งˆ๋„ OnCameraAddEvent ๋ฉ”์†Œ๋“œ๋ช…์œผ๋กœ ๋ฏธ๋ฃจ์–ด ๋ด์„œ
์ƒ˜ํ”Œ์†Œ์Šค๋ฅผ ์˜ฌ๋ฆฌ์…”๋„ camera๊ฐ€ ์—†์œผ๋ฉด ํž˜๋“œ์‹ค๊ฒƒ๊ฐ™๋„ค์š”
(web cam ์ด๋ผ๋ฉด ์ €๋Ÿฐ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€๋„ ์•Š๊ฒ ์ง€์š”)

Dispacher ๊ด€๋ จ์œผ๋กœ ๋‹ค์–‘ํ•œ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด์„œ ์ด๊ฒƒ์ €๊ฒƒ ์ ์šฉํ•ด๋ณด์‹œ๊ฑฐ๋‚˜
๊ทผ๋ฐ
Dispatcher.Invoke(DispatcherPriority.Normal
, new Action(
delegate
{
//์‚ฌ์šฉํ•  ๋ฉ”์„œ๋“œ ๋ฐ ๋™์ž‘
MainUi.Children.Add(newIoUC);
}));

Current handler ์žก์•„์™€์„œ Priority ์„ค์ •ํ•˜์ง€ ์•Š๋‚˜์š”??
์†Œ์Šค๋งŒ ๋ด์„œ ์ž˜๋ชจ๋ฅด๊ฒ ์ง€๋งŒ scroll ๊ตฌ๋ฌธ๋„ ๋ณด์ด๊ณ 
ui thread๊ฐ€ ๋‹ต์ด ์—†๋Š”๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ ํŒ๋‹จํ•˜๊ธฐ ํž˜๋“ญ๋‹ˆ๋‹ค.

1 Like

๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ DalsaCamera๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Camera ์ž์ฒด๋Š” Dalsa Library ๊ด€๋ จ๋œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
camScrollView Control์€ FlowLayoutPanel์ž…๋‹ˆ๋‹ค.
๊ฐ„๋‹จํ•˜๊ฒŒ ์•„๋ž˜์— ๊ตฌ์กฐ๋ฅผ ์ ์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์นด๋ฉ”๋ผ ์ธ์‹ Thread
์ธ์‹ โ†’ ์นด๋ฉ”๋ผ ๊ฐ์ฒด ์ƒ์„ฑ โ†’ Control ์ถ”๊ฐ€

์ธ์‹ : ์นด๋ฉ”๋ผ ์—ฐ๊ฒฐ ๋ฐ ํ•ด์ œ ์ธ์‹
์นด๋ฉ”๋ผ ๊ฐ์ฒด ์ƒ์„ฑ : ์นด๋ฉ”๋ผ View Control ์ƒ์„ฑ ๋ฐ ์นด๋ฉ”๋ผ ์ •๋ณด
Control ์ถ”๊ฐ€ : FlowLayoutPanel์— ์นด๋ฉ”๋ผ View Control ์ถ”๊ฐ€

์นด๋ฉ”๋ผ View Control

public class CameraView: PictureBox
{
    private SapView sapView;

    public CameraView() { }
    protected override void OnPaint(PaintEventArgs e)
    {
        if (sapView != null && sapView.Initialized)
        {
            sapView.OnPaint();
        }
        base.OnPaint(e);
    }

    public SapView View
    {
        get { return this.sapView; }
        set
        {
            this.sapView = value;

            if (this.sapView != null)
            {
                this.sapView.Window = this;
            }
        }
    }

     public void UpdateViewSize(Size size)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new Action<Size>(UpdateViewSize), size);
            }
            else
            {
                Initialized = true;
                this.Size = size;
                decimal WidthScalor = (decimal)(100.0f * this.Width / this.sapView.Buffer.Width);
                decimal HeightScalor = (decimal)(100.0f * this.Height / this.sapView.Buffer.Height);
                this.sapView.SetScalingMode((float)WidthScalor / 100.0f, (float)HeightScalor / 100.0f);
            }
        }
}
1 Like

์œ„ ๋‹ต๋ณ€ ์ฝ”๋“œ UpdateViewSize ํ•จ์ˆ˜์—์„œ ๋ฉˆ์ถค ํ˜„์ƒ์ด ์ผ์–ด๋‚˜๋„ค์š”.

this.Invoke(new Action<Size>(UpdateViewSize), size);

์ด ์ค„์—์„œ ๋ฉˆ์ถค ํ˜„์ƒ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ํ™œ์–ดํšŒ์†Œ์ฃผ์›์ƒท์šฐ๋Ÿญ๋‘๊ฐœ๋” ๊ฐœ๋ฐœ์ž๋‹˜ ์˜๊ฒฌ์„ ํ†ตํ•ด ์ƒ๊ฐ ํ•ด๋ณด์•˜๋Š”๋ฐ, ํ•ด๋‹น PictureBox์— View๊ฐ€ ๊ณ„์† UI Thread๋ฅผ ์žก์•„ ๋จน๊ณ  ์žˆ๋Š” ๊ฒŒ ์•„๋‹ ๊นŒ? ์ƒ๊ฐ์ด ๋“œ๋„ค์š”.

๋‹ค๋ฅธ ๋ถ„๋“ค ์ƒ๊ฐ๋„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.!

3 Likes

์‚ฌ์‹ค ๊ทผ๋ณธ ์›์ธ์„ ์ฐพ๋Š”๊ฒŒ ์šฐ์„ ์ด๊ธดํ•œ๋ฐ์š”โ€ฆใ…Žใ…ŽInvoke๋ฅผ BeginInvoke๋กœ ๋ฐ”๊ฟ”๋ณด์‹œ๊ฒ ์–ด์š”?
Invoke๋Š” ๋‚ด ์ฐจ๋ก€์™€์„œ ๋™์ž‘ํ• ๋•Œ๊นŒ์ง€ ์กด๋ฒ„!
BeginInvoke๋Š” ์•„ ๋ชจ๋ฅด๊ฒ ๊ณ  ์ด๋”ฐ๊ฐ€ ์ด๊ฑฐ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ํ•ด์ค˜. ๊ทธ๋Ÿผ ๋‚˜๋Š” ์ด๋งŒ ๋น ์—ผ!
ํ•˜๋Š”๊ฒƒ์ž…๋‹ˆ๋‹ค ใ…Žใ…Ž

3 Likes

์•ˆ๋…•ํ•˜์„ธ์š”.

Image Grab Complete Event๋ฅผ Subscribe ๋ฐ›์•„ UI์— ์˜ฌ๋ฆฌ๋‹ค๋ณด๋ฉด

Event๋ฅผ ์‹คํ–‰ํ•˜๋Š” Thread์™€ UI Thread์™€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  Event์— ํ•ด๋‹นํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ Dalsa lib๋กœ Grab์„ ํ•˜๊ฒŒ๋˜๋ฉด PC์˜ SDK๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Grabํ•˜๋Š” ํ˜•ํƒœ๋‹ค๋ณด๋‹ˆ ๋ณ„๊ฐœ Thread๋ฅผ ํ†ตํ•ด Image๋ฅผ ๋ฐ›์•„์˜ค์‹ญ๋‹ˆ๋‹ค.

์ด๋Ÿด๋•Œ๋Š” Event๋ฅผ Subscribe ํ•  ๋•Œ Current Thread๋ฅผ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜์…จ๋‹ค Action์„ ํƒœ์šฐ์…”์•ผ์•ผํ•ฉ๋‹ˆ๋‹ค.

2 Likes