private void UpdateQualityInfoTh(object oPassword)
        {
            char[] v = (oPassword as char[]);
            if (v == null)
            {
                Debug.Assert(false); return;
            }

            char[] vNew = null;
            try
            {
                Debug.Assert(m_tbPassword.InvokeRequired);

                uint uBits = QualityEstimation.EstimatePasswordBits(v);

                SecureTextBoxEx tb = m_tbPassword;
                if (tb == null)
                {
                    return;                            // Control disposed in the meanwhile
                }
                // Test whether the password has changed in the meanwhile
                vNew = (tb.Invoke(new UqiGetPasswordDelegate(
                                      this.UqiGetPassword)) as char[]);
                if (!MemUtil.ArrayHelperExOfChar.Equals(v, vNew))
                {
                    return;
                }

                tb.Invoke(new UqiShowQualityDelegate(this.UqiShowQuality),
                          uBits, (uint)v.Length);
            }
            catch (Exception) { Debug.Assert(false); }
            finally
            {
                string strTask = GetUqiTaskID(v);
                lock (m_oUqiTasksSync) { m_lUqiTasks.Remove(strTask); }

                MemUtil.ZeroArray <char>(v);
                if (vNew != null)
                {
                    MemUtil.ZeroArray <char>(vNew);
                }
            }
        }