程序在引用队列中的前包时终止

时间:2018-07-04 03:06:17

标签: multithreading ffmpeg

我有2个线程来解码RTSP流视频,我的代码如下:

namespace Library.Models.Bible
{
    public class BibleModel : IPopulatable<BibleModel, DataTable>, IPopulatable<BibleModel, DataRow>
    {
        public Int32? ID { get; set; }
    [MinLength(4, ErrorMessage = "Bible name must be between 4-100 characters")]
    [MaxLength(100, ErrorMessage = "Bible name must be between 4-100 characters")]
    public String Name { get; set; }

    [MinLength(3, ErrorMessage = "Bible abbreviation must be between 3-9 characters")]
    [MaxLength(9, ErrorMessage = "Bible abbreviation must be between 3-9 characters")]
    [ValidateBibleAbbreviationExists]
    public String Abbreviation { get; set; }

    [MaxLength(250, ErrorMessage = "Publisher may not exceed 250 characters")]
    public String Publisher { get; set; }

    [MaxLength(3000, ErrorMessage = "Copyright may not exceed 3000 characters")]
    public String Copyright { get; set; }

    [MaxLength(3000, ErrorMessage = "Notes may not exceed 3000 characters")]
    public String Notes { get; set; }

    [EnumDataType(typeof(Enums.eTxtDir), ErrorMessage = "Text direction does not exist. Allowed values: LTR, RTL")]
    public String TextDirection { get; set; }

    [JsonIgnore]
    public Int16 Active { get; set; } = 1;

    public BibleModel Populate(DataTable dT)
    {
        if (dT != null && dT.Rows.Count > 0)
            return Populate(dT.Rows[0]);
        return null;
    }

    public BibleModel Populate(DataRow ro)
    {
        if(ro != null)
        {
            this.ID = Convert.ToInt32(ro["Bible_ID"]);
            this.Name = ro["Name"].ToString();
            this.Abbreviation = ro["Abbr"].ToString();
            this.Publisher = ro["Publisher"].ToString();
            this.Copyright = ro["Copyright"].ToString();
            this.Notes = ro["Notes"].ToString();
            this.TextDirection = ro["TxtDir"].ToString();
            return this;
        }
        return null;
    }        
}

我的程序在以下行崩溃:* packet = Packet_buf.front();

您能帮我发现问题吗,谢谢!

1 个答案:

答案 0 :(得分:0)

您的代码中有一个以上的问题,其中一些:

1) std::queue<AVpacket> Packet_buf;

我认为应该是:

std::queue<AVPacket> Packet_buf;注意AVpacketAVPacket是完全不同的东西。 (是的,我猜这只是一个错字)。

2) while(key==0) {}这不是等待变量更改的好方法。特别是如果变量(key)不是volatile。它可能会工作,也许正在工作。但是我建议您在这里使用 pthread signalcond ition变量。还要检查下一个密切相关的问题(3)。

3) *packet = Packet_buf.front();在检查容器是否为std::queue.front()之前对empty()进行校准不是一个好主意。如果容器(队列)比front()方法为空,则此处将导致未定义的行为。

希望有帮助。